2013-03-04 78 views
1

從蟒蛇,我調用Java功能:如何停止系統調用的當前執行的python

os.system("java -jar example.jar run myFunction 'inFile.txt' 'outFile.txt' ") 

這個功能是處理文件和輸出寫入「outFile.txt」。輸出取決於'inFile.txt'中的信息。在處理輸入文件並寫入輸出文件時,有時'outFile.txt'會變得太大(幾十GB),並且當時我想退出並處理當前的處理並繼續處理另一個inFile.txt文件

有沒有辦法知道我正在寫入的outFile.txt的增長超過了10GB。

編輯: 正如Maksym所建議的,我使用下面的代碼,似乎工作。謝謝

import subprocess 
from time import sleep 
p = subprocess.Popen(["java", "-jar", "example.jar", "run", "myFunction", "'inFile.txt'", "'outFile.txt'") 
rc = p.poll() #returncode 
while (rc == None): 
    sleep(1) 
    if(os.path.getsize(outFileName) < 1000000000): 
     rc = p.poll() 
     continue 
    else: 
     p.kill() 
     break 

回答

2

看看subprocess模塊。使用POPEN你可以創建一個進程並殺死它時,你需要這樣的:

import subprocess 
from time import sleep 
p = subprocess.Popen(["java", "-jar", "example.jar", "run", "myFunction", "'inFile.txt'", "'outFile.txt'") 
while not check_my_conditions(): 
    sleep(my_timeout) 
p.kill() 

然後,您可以旋轉你的文件,並重新啓動進程。

+0

我編輯我的OP。但是退出條件不正常 – user1140126 2013-03-06 20:52:47

0

java應用程序在運行時是否向stdout或stderr提供任何輸出(例如,處理的記錄數)?如果是這樣,你可以使用Python的Popen類(在子進程模塊中)調用它,並估計它何時處理過多。

+0

它將輸出寫入outFile.txt。它在處理完成時寫入標準輸出。 – user1140126 2013-03-04 19:39:46

1

而不是直接調用os.system,你應該強烈考慮使用multiprocessing.Process內置類。它更加優雅地處理產生的進程。

您需要定期觀看輸出文件,或者使用類似os.stat的文件來檢查文件大小。當超過閾值時,您可以終止原始程序(或任何您想要執行的程序)。

+0

至少,Windows在關閉之前似乎沒有更新文件的「大小」。不確定os.stat會有幫助,如果他在Windows上 - 提交者確實說他看不到文件大小。或者他確實如此;這個問題似乎已被編輯。 – LAK 2013-03-04 19:42:59

+0

'os.stat'在Windows上可用。 [看文檔](http://docs.python.org/2/library/os.html#os.stat) – jknupp 2013-03-04 19:46:48

+0

我知道os.stat(),但問題是st_size爲0的文件目前是開放的,仍然在寫入(再次,在Windows下;我不確定這個問題適用於什麼操作系統)。 – LAK 2013-03-04 20:09:23