国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

python3.x - Java ruft Python auf, der Python-Code stoppt automatisch und der Grund kann nicht gefunden werden
習(xí)慣沉默
習(xí)慣沉默 2017-06-28 09:23:50
0
3
1247
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

習(xí)慣沉默
習(xí)慣沉默

Antworte allen(3)
Peter_Zhu

對(duì)于java和python的交互,我倒是可以給你一個(gè)思路,僅做參考。我之前做過一個(gè)項(xiàng)目,使用的是socket,手機(jī)端是java腳本,服務(wù)端是python,然后java向python服務(wù)端發(fā)送字符串進(jìn)行交互。你可以試試。

巴扎黑

你可以去看看jython,可以在java中直接執(zhí)行python代碼

漂亮男人

這段代碼有個(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呢?

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage