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
對(duì)于java和python的交互,我倒是可以給你一個(gè)思路,僅做參考。我之前做過一個(gè)項(xiàng)目,使用的是socket,手機(jī)端是java腳本,服務(wù)端是python,然后java向python服務(wù)端發(fā)送字符串進(jìn)行交互。你可以試試。
這段代碼有個(gè)問題:
Process process = Runtime.getRuntime().exec(args);
int exitValue = process.waitFor(); // A
... process.getInputStream() ... // B
應(yīng)該是先處理BgetInputStream()
再處理AwaitFor
,因?yàn)镴ava跟它調(diào)用的程序是通過管道(pipe)通訊的,如果不及時(shí)讀取管道,被調(diào)用的程序在寫stdout時(shí)就有可能阻塞住。
所以正確的順序是:
Process process = Runtime.getRuntime().exec(args);
... process.getInputStream() ... // B
... process.getErrorStream() ... // C
int exitValue = process.waitFor(); // A
另外留下個(gè)問題:
如果被調(diào)用程序先寫stderr再寫stdout,不還是會(huì)阻塞嗎?Java到底應(yīng)該先讀inputStream
還是先讀errorStream
呢?