2017-08-14 9 views
0

私はこれを実行していたときにpythonスクリプトを実行した結果を読んでみたいと思っていました。JavaプログラムはPythonからの連続出力を表示します

私は次のように私の質問を再現:私は私のコードを書き直し

read.java

public static void main(String[] args) throws IOException{ 

    Runtime rt = Runtime.getRuntime(); 
    String[] commands = {"python.exe","hello.py"}; //execute the hello.py under path 
    Process proc = rt.exec(commands); 

    BufferedReader stdInput = new BufferedReader(new 
     InputStreamReader(proc.getInputStream())); 

    BufferedReader stdError = new BufferedReader(new 
     InputStreamReader(proc.getErrorStream())); 

    // read the output from the command 
    System.out.println("Here is the standard output of the command:\n"); 
    String s = null; 
    while ((s = stdInput.readLine()) != null) { 
     System.out.println(s); 
    } 

    // read any errors from the attempted command 
    System.out.println("Here is the standard error of the command (if any):\n"); 
    while ((s = stdError.readLine()) != null) { 
     System.out.println(s); 
    } 

hello.py

import time 

print "123\n" 
time.sleep(5) #wait 5 sec and print next line 
print '456' 

---更新---

を次のように、しかしそれは動作していないようだ。

public class Hello implements Runnable { 

    public void run() { 
     String[] commands = { "python.exe", "hello.py" }; 
     ProcessBuilder pb = new ProcessBuilder(commands); 
     pb.inheritIO(); 
     try { 
      Process p = pb.start(); 
      int result = p.waitFor(); 
     } catch (IOException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 
     (new Thread(new Hello())).start(); 
    } 

} 
+0

すべての結果をすぐに受信している場合は、すべて正常に動作しています。外部プログラムから非同期メッセージを受信したい場合は、スレッド上でさらに作業する必要があります。おそらくプロセス作成者 – Pfeiffer

+0

についてお読みになりたい場合は、 http://www.javaworldを読んでください。 com/article/2071275/core-java/when-runtime-exec --- won-t.html?page = 2 https://www.java-tips.org/java-se-tips-100019/88888889 -java-util/426-from-runtimeexec-to-processbuilder.html – Pfeiffer

答えて

3

私は仕事にあなたの現在のソリューションについて

String[] commands = { "python.exe", "hello.py" }; 
ProcessBuilder pb = new ProcessBuilder(commands); 
pb.inheritIO(); 
try { 
    Process p = pb.start(); 
    int result = p.waitFor(); 
} catch (IOException | InterruptedException e) { 
    e.printStackTrace(); 
} 

ようProcessBuilderinheritIO、何かを好むだろう、あなたは、非ブロッキングスレッドでIOを処理する必要があります。

+0

これはOP質問には答えません。あなたの意見を追加するだけです。 (しかし、私はProcessBuilderに同意します) – Pfeiffer

+0

@Pfeiffer *現在のソリューションが機能するためには、非ブロックスレッドでIOを処理する必要があります。* OPは現在、IOを連続して(そして1つのスレッドで)処理しています。 –

+0

申し訳ありませんが、私は眠くて、その行を読んでいませんでした。 – Pfeiffer

関連する問題