我目前正在开发一个 Java 项目,该项目允许我编辑、保存然后执行 Python 代码。然而,我在执行这段代码时遇到了障碍。
为了执行代码,我一直在执行以下操作:
Process p = Runtime.getRuntime().exec("python someFileName.py",null,new File("someFilePath");
从这里开始,我有一个类接受这个过程,并尝试从该过程中获取输入和输出流。我有一个带有 Action 监听器的计时器,每 0.01 秒刷新一次。
但这不是问题所在。如果我的程序仅包含 python 中的 print 语句,我可以很好地接收输入。
如果我的程序包含任何需要阻止的内容(raw_input 或 time.sleep),则不会显示任何内容。
我的actionPerformed方法如下:
public void actionPerformed(ActionEvent e)
{
try
{
while(inStream.available() > 0)
{
System.out.print((char)inStream.read());
}
while(errStream.available() > 0)
{
System.out.print((char)errStream.read());
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
为了处理输出,我在 JTextArea 上有一个 KeyListener,它将将该区域的内容发送到输出流。
每当我的 Python 程序中有任何内容需要阻塞时,无论程序中的哪个位置,整个内容都会被锁定。
例如,我有这个 python 程序:
import time
print "Welcome to my Program!"
print "Performing calculations"
time.sleep(5)
num = 5
print "Adding 5 to your number"
for x in range(5):
num+=1
print num
print "Finished!"
在 hibernate 期间不会显示任何内容。我假设我在 Java 程序中收到的内容是:
欢迎来到我的节目! 执行计算 ...然后五秒钟什么都没有...然后 在你的号码上加 5 6 7 8 9 10 完成!
但是直到 5 秒过去之后才显示任何内容。这样我就可以执行该程序,等待 5 秒钟,然后出现大量文本。
或者使用 raw_input ,也会发生同样的事情。换句话说,我不能用它来提示用户输入。
我希望能就这个阻塞问题获得一些帮助,以便我的文本逐渐显示,而不是必须等待计时器或输入中的所有内容都消失。
感谢任何帮助或资源。我当前的操作系统是 Mac,但我希望任何解决方案也能在 Windows 上运行(如果可能的话)。
最佳答案
默认情况下,Python 脚本使用缓冲输出运行。这意味着在脚本退出并刷新之前您可能看不到任何标准输出。您所要做的就是使用 -u 启动 python 来请求无缓冲的输出。然后你就会看到你所期待的。
python -u someFileName.py
关于java - 从 Java 内部处理 Python IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12064904/