2012-01-04 56 views
1

我用這條線從Java應用程序中執行python腳本:啓動過程不消耗其輸出

Process process = Runtime.getRuntime().exec("python foo.py", null, directory); 

腳本運行與我的Java應用程序和其他客戶端通信的TCP服務器。

當我調試腳本時,我在這裏和那裏都有一些控制檯打印,一切都很好。腳本從Java代碼啓動後,在一段固定的時間後,我的TCP服務器沒有響應。經過一段時間的調試和挫折之後,我從腳本中刪除了我的打印件,並且一切按預期工作。

似乎有一些內存分配給進程的標準輸出和錯誤流,如果你沒有使用它,進程在嘗試寫入完整緩衝區時卡住了。

如何啓動該過程以便我不必消耗標準輸出流?我想保留打印以供調試,但不想啓動一個讀取我不需要的流的線程。

回答

2

您必須使用子進程的輸出,或者最終會因爲輸出緩衝區已滿而阻塞(不要忘記stderr)。如果你不想修改你的Java程序來使用它,也許你可以在你的腳本中添加一個標誌來完全關閉調試,或者至少將它指向一個文件(可能是/ dev/null)。

+0

由於某些原因,這不適用於Java:Runtime.getRuntime()。exec(「python foo.py> NUL」,null,directory);我試過使用文件,但沒有運氣。在我在這裏發佈我的問題之前,我這樣做了。正如@jenaiz提到的那樣,這可能比腳本中的硬編碼開關更受歡迎 – unexplored 2012-01-04 19:58:03

+1

@unexplored它不起作用,因爲'>'是一個shell運算符,並且您正在直接執行python解釋器,而沒有shell。你可以用Java來調用一個shell,並將它傳遞給運行'python'所需的參數,但這是一個混亂的痛苦,更不便攜。相反,請修改您的腳本本身。 – erickson 2012-01-04 20:09:03

1

Java公開了ProcessBuilder。這是你可以用來執行你想要的東西。這是一個fork-exec,也可以讓你處理輸出和錯誤流。

您的進程掛起的事實不是因爲java。它是一個標準問題,因爲流已滿並且沒有人正在使用它,因此您的流程被阻止。

嘗試使用ProcessBuilder和讀取流的線程。

0

我在過去做了一些類似的事情,並且將進程的退出重定向到與進程相關的特定文件日誌。之後你可以看到發生了什麼。你可以維護你的Python腳本的蹤跡。