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

習慣沉默
習慣沉默

Antworte allen(3)
Peter_Zhu

对于java和python的交互,我倒是可以给你一个思路,仅做参考。我之前做过一个项目,使用的是socket,手机端是java脚本,服务端是python,然后java向python服务端发送字符串进行交互。你可以试试。

巴扎黑

你可以去看看jython,可以在java中直接执行python代码

漂亮男人

这段代码有个问题:

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呢?

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