我有一个通过异步进程调用 Python 的 Java 代码,我希望 Python 进程能够监听 Java 中的 stdout
直到打印出一些内容。
下面是java代码:
import java.io.*;
public class host {
public static void main(String[] args) throws Exception{
System.out.println("java starts at " + System.currentTimeMillis() + " ms");
ProcessBuilder pb = new ProcessBuilder("python","a.py");
Process tr = pb.start();
System.out.println("First msg");
System.out.println("Second msg");
Thread.sleep(3000);
System.out.println("x");
System.out.println("java ends at " + System.currentTimeMillis() + " ms");
}
}
下面是Python代码:
import sys
import time
if __name__=="__main__":
fo=open("a.txt","w")
fo.write('python starts at: %.0f\n'%(time.time()*1000))
line = sys.stdout.readline()
while(line != "x\n"):
fo.write(line+"\n")
line = sys.stdout.readline()
fo.write('python ends at: %.0f\n'%(time.time()*1000))
fo.close()
但是,Python 进程似乎无法从 Java 捕获 stdout
。由于我是Java新手,我不确定是否存在根本性错误,以及上述模型是否提供了Java和Python之间通信的有效方式。
编辑(更新)
根据答案/评论,我修改了我的Java代码如下:
import java.io.*;
public class host {
public static void main(String[] args) throws Exception{
System.out.println("java starts at " + System.currentTimeMillis() + " ms");
ProcessBuilder pb = new ProcessBuilder("python","a.py");
Process tr = pb.start();
PrintStream ps = new PrintStream(tr.getOutputStream());
ps.println("First msg"); ps.flush();
ps.println("Second msg"); ps.flush();
Thread.sleep(3000);
ps.println("x"); ps.flush();
System.out.println("java ends at " + System.currentTimeMillis() + " ms");
}
}
并更改了 python 脚本如下:
import sys
import time
if __name__=="__main__":
fo=open("a.txt","w")
fo.write('python starts at: %.0f\n'%(time.time()*1000))
line = sys.stdin.readline()
while(line != "x\n"):
fo.write(line+"\n")
line = sys.stdin.readline()
fo.write('python ends at: %.0f\n'%(time.time()*1000))
fo.close()
以下是输出:
python starts at: 1453263858103
First msg
First msg
Second msg
python ends at: 1453263863103
最佳答案
接收进程应该监听标准输入,而不是标准输出。
然后将输出从 java 传输到 python:
java -jar myjava.jar | java -jar myjava.jar | python mylistener
关于java - Java 和 Python 通过 stdout 进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888082/