Heim > Fragen und Antworten > Hauptteil
String[] args = {"python3", pythonFile};
Process process = Runtime.getRuntime().exec(args);
int exitValue = process.waitFor();
BufferedInputStream in = new BufferedInputStream(process.getInputStream());
BufferedInputStream err = new BufferedInputStream(process.getErrorStream());
BufferedReader inBr = new BufferedReader(new InputStreamReader(in));
BufferedReader errBr = new BufferedReader(new InputStreamReader(err));
String lineStr;
while ((lineStr = inBr.readLine()) != null) {
logger.info(lineStr);
}
while ((lineStr = errBr.readLine()) != null) {
logger.error(lineStr);
}
inBr.close();
errBr.close();
in.close();
err.close();
Rufen Sie den Python-Code auf. Die Ausführungszeit ist relativ lang und wird auf mehrere Stunden geschätzt, etwa fünf oder sechs Stunden. Wenn Sie den Python-Befehl allein direkt in der Shell ausführen, gibt es kein Problem. Wenn Sie jedoch Java verwenden, um Python auf diese Weise aufzurufen, tritt ein Problem auf: Nach einer gewissen Zeit wird Python keine Ausgabe mehr haben. Ich kann feststellen, ob Python ausgeführt wird, indem ich kontinuierlich Dateien schreibe und von Zeit zu Zeit Dateien in das Dateisystem schreibe. Wenn Sie den Python-Befehl direkt in die Shell eingeben, ist das normal. Java ruft Python auf. Nach mehr als drei Stunden werden keine Dateien generiert, aber mit htop wird überprüft, ob der Thread immer noch vorhanden ist. Die Laufumgebung ist Ubuntu
天蓬老师2017-06-28 09:25:50
对于java和python的交互,我倒是可以给你一个思路,仅做参考。我之前做过一个项目,使用的是socket,手机端是java脚本,服务端是python,然后java向python服务端发送字符串进行交互。你可以试试。
漂亮男人2017-06-28 09:25:50
这段代码有个问题:
Process process = Runtime.getRuntime().exec(args);
int exitValue = process.waitFor(); // A
... process.getInputStream() ... // B
应该是先处理BgetInputStream()
再处理AwaitFor
,因为Java跟它调用的程序是通过管道(pipe)通讯的,如果不及时读取管道,被调用的程序在写stdout时就有可能阻塞住。
所以正确的顺序是:
Process process = Runtime.getRuntime().exec(args);
... process.getInputStream() ... // B
... process.getErrorStream() ... // C
int exitValue = process.waitFor(); // A
另外留下个问题:
如果被调用程序先写stderr再写stdout,不还是会阻塞吗?Java到底应该先读inputStream
还是先读errorStream
呢?