我知道有类似的问题已被问过,但在尝试了多种不同的配置后,我仍然没有找到我正在寻找的解决方案。当我从java运行我的python文件时,它会一次打印所有生成的行,而不是在执行时打印。
我有一个显示简单UI的java程序,一旦用户输入了所需的所有参数,我将这些信息传递给一组工作的python脚本。因为python程序非常广泛并且需要一段时间才能运行,所以会有一系列更新的状态消息将打印到命令提示符。为了测试在Java中运行进程,我设置了两个简单的测试文件。
我的测试java如下
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("python -u Test.py");
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = "";
while((line = b2.readLine()) != null){
System.out.println(line);
}
我的Test.py文件看起来像(编辑)我添加了Unbuffered类,如链接示例所示,但仍然没有运气。
class Unbuffered(object):
def __init__(self,stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def __getattr__(self.stream, attr):
return getattr(self.stream, attr)
sys.stdout = Unbuffered(sys.stdout)
print "Hello World"
time.sleep(5)
print "Hello again!"
当我运行我的java文件时,它会在显示python文件中的两个打印行之前等待5秒钟。但我希望它不会阻止进程并打印出在python文件中到达的每一行。任何帮助将不胜感激。
编辑:(已解决)
我的问题是我必须在主程序之外处理新进程。我最终得到了像
这样的东西public class MyRunnable implements Runnable{
public void run(){
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("python Test.py");
StreamGobbler errGobbler = new StreamGobbler(proc.getErrorStream(), "Error");
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "Output");
errGobbler.start();
outputGobbler.start()
}
public static void main(String[] args){
MyRunnable myRun = new MyRunnable();
Thread myThread = new Thread(myRun);
myThread.start();
}