Tobiq:
私は(ちょうど1つのファイルを開いていない、コンソールからのライブ)Pythonコードを実行しようとしています。
ProcessBuilder builder = new ProcessBuilder("python");
Process process = builder.start();
new Thread(() -> {
try {
process.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
String line;
final BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
// Ignore line, or do something with it
while (true) try {
if ((line = reader.readLine()) == null) break;
else System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
final PrintWriter writer = new PrintWriter(new OutputStreamWriter(process.getOutputStream()));
writer.println("1");
writer.println("2 * 2");
私はこのコードを試してみましたが、次の式をプッシュしようした後1
と2*2
、私は応答(私の式の評価)を得ることはありません。
誰もが問題が何であるかを知っていますか?
エリオットの新鮮:
あなたのpython
コードは何を印刷するように見える、と別のプロセスに読み書きするために複数のスレッドを処理することは難しい話題ではありません。幸運なことに、機能が内蔵されています。あなたは何ができます
ProcessBuilder builder = new ProcessBuilder("/usr/bin/env", "python",
"-c", "print(2*2); exit()");
builder.inheritIO();
try {
Process process = builder.start();
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
どの出力
4
そして終了。あまり些細なPythonとJavaの統合のために、私は強くあなたが見てお勧めしますここに。既存のコードについては、あなたは決してexit()
Pythonとあなたは決してflush()
あなたPrintWriter
。そして、あなたは上で記述しmain
たスレッド。そして、あなたは合格する必要がある-i
のpythonに、またはそれが標準入力負いませんコンソールがあります。にあなたのコードを変更します
ProcessBuilder builder = new ProcessBuilder("/usr/bin/env", "python", "-i");
Process process = builder.start();
new Thread(() -> {
String line;
final BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
// Ignore line, or do something with it
while (true)
try {
if ((line = reader.readLine()) == null)
break;
else
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
final PrintWriter writer = new PrintWriter(
new OutputStreamWriter(process.getOutputStream()));
writer.println("1");
writer.println("2 * 2");
writer.println("exit()");
writer.flush();
}).start();
正常に動作しているようです。