我有一個通過異步進程調用Python的Java代碼,我希望Python進程能夠從Java中監聽stdout
,直到打印出某些東西。通過stdout實現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();
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通信之間的有效方法。
EDIT(UPDATE)
基於答案/評論,我修改了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
你曾經通過重定向修修補補? https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.Redirect.html –
您的ProcessBuilder和它在啓動python時創建的新運行時環境具有自己的in,out和err流。它們與Syste.in/out/err不同。使用ProcessBuilder.redirectInput()。 – JayC667
@ JayC667這就是我的想法,但我如何將Java stdout傳遞給python? –