サブプロセスとしてJavaから実行Pythonスクリプト

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");

私はこのコードを試してみましたが、次の式をプッシュしようした後12*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();

正常に動作しているようです。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=478563&siteId=1