搜尋

首頁  >  問答  >  主體

python3.x - java呼叫python,python程式碼自動停止了,找不到原因

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

呼叫python程式碼,執行時間比較長,估計有好幾個小時,大概五、六個小時。如果單獨直接在shell中執行Python指令,則不會出問題;但是,使用這種方式java呼叫python,就有問題:一段時間之後,python沒有輸出了。判斷python是否正在運行,我的方式是:不斷寫文件,每隔一段時間,寫文件到文件系統中。如果是直接shell中輸入python指令執行,那麼是正常的。 java呼叫python,三個多小時之後,就沒有產生檔案了,但使用htop查看,執行緒還在。運行環境是ubuntu

習慣沉默習慣沉默2787 天前1168

全部回覆(3)我來回復

  • 天蓬老师

    天蓬老师2017-06-28 09:25:50

    對於java和python的交互,我倒是可以給你一個思路,只做參考。我之前做過一個項目,使用的是socket,手機端是java腳本,服務端是python,然後java向python服務端發送字串進行交互。你可以試試。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-28 09:25:50

    你可以去看看jython,可以在java中直接執行python程式碼

    回覆
    0
  • 漂亮男人

    漂亮男人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呢?

    回覆
    0
  • 取消回覆