2016-01-19 38 views
0

我有一個通過異步進程調用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 
+0

你曾經通過重定向修修補補? https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.Redirect.html –

+0

您的ProcessBuilder和它在啓動python時創建的新運行時環境具有自己的in,out和err流。它們與Syste.in/out/err不同。使用ProcessBuilder.redirectInput()。 – JayC667

+0

@ JayC667這就是我的想法,但我如何將Java stdout傳遞給python? –

回答

1

在java中,寫信給你創建的過程:

ProcessBuilder pb = new ProcessBuilder("python","a.py"); 
Process tr = pb.start(); 
tr.getOutputStream().println("First msg"); 

在Python中,從stdin閱讀:

line = sys.stdin.readline() 
+0

我編輯我的腳本作爲你的建議進行小的修改,但仍然有問題(請參閱問題) –

+0

甚至沒有第一行和最後一行? (「python開始/結束」?) – njzk2

+0

對不起,我錯過了:「python開始/結束」是什麼意思? –

2

接收過程應該監聽標準輸入,而不是標準輸出。

然後通過管道將輸出從Java到蟒:

Java的罐子myjava.jar |蟒蛇myListener的