2

他の場所で使用できるように、次のコードを機能させようとしています。

事実上、別のプロセスを開始し、その中で python を実行し、python にいくつかのコマンドを供給します。ただし、実際には、そのプロセスへのストリームを閉じない限り、python コマンドは送信されません。flush() がこれを強制的に発生させるはずだと思っていましたが、機能していないようです。flush() が機能しない理由と、これを回避するために何ができるかについて、誰かが洞察を提供できますか? ありがとう。

close() を呼び出すと、コマンドが送信されることに注意してください。ただし、この 1 つのコマンドの後にさらにコマンドを送信できるようにしたいので、ここで close() を使用することは受け入れられないようです。(私は最終的にすべてを close() します)

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;

public class Foo {
 public static void main(String[] args) throws IOException {
  Process cmd = Runtime.getRuntime().exec("python");

  InputStream inStream = cmd.getInputStream();
  Thread stdout = new Thread(new stdOutReader(inStream));
  stdout.start();

  InputStream errStream = cmd.getErrorStream();
  Thread stderr = new Thread(new stdOutReader(errStream));
  stderr.start();

  OutputStream outStream = cmd.getOutputStream();
  OutputStreamWriter os = new OutputStreamWriter(outStream);
  PrintWriter pWriter = new PrintWriter(outStream, true);
  pWriter.println("print \"Testing..\"");

  pWriter.flush();
  int x = 0;
  while (x < 100){
      //Do stuff here (will not be an infinite loop in actual code)
  }

  pWriter.close();

}
private static class stdOutReader implements Runnable{
   InputStream inStream;

   public stdOutReader(InputStream inStream){
       this.inStream = inStream;
   }

   public void run() {
       InputStreamReader reader = new InputStreamReader(this.inStream);
       Scanner scan = new Scanner(reader);
       while (scan.hasNext()) {
          System.out.println(scan.next());
          System.out.flush();
       }
   }
 }
}
4

2 に答える 2

0

私はあなたのプログラムFooに何も悪いことを見ることができません。(Pythonではなく)入力を出力にエコーバックするプログラムでテストしましたが、完全に機能します。

于 2012-10-04T19:07:38.617 に答える
0

API を直接使用する代わりに、Apache Commons Executorを使用することを検討してください。Runtime.exec()

于 2012-10-04T18:47:44.750 に答える