[英]Communication between Java and Python through stdout
我有一個Java代碼通過異步過程調用Python,並且我希望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 | python mylistener
在Java中,寫入您創建的過程:
ProcessBuilder pb = new ProcessBuilder("python","a.py");
Process tr = pb.start();
tr.getOutputStream().println("First msg");
在python中,從stdin
讀取:
line = sys.stdin.readline()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.