2013-04-13 78 views
1

我知道終止子進程調用的問題已經被問了幾次,包括here,但是,試圖遵循這些答案,我似乎無法讓我的腳本掛起(在我的情況下,我正在執行一個幻影腳本)。例如,如果我嘗試在我的幻影代碼中加載不存在的jquery文件,該腳本將掛起,即使我有超時。這裏是我的代碼:如何用超時終止這個子進程?

def kill_proc(): 
    if p.poll() != 0: 
     process.kill() 


p = subprocess.Popen(['phantomjs','file.js'],stdout=subprocess.PIPE) 
    out, phantomError = p.communicate() 

t = Timer(5, kill_proc) # should kill it after 5 seconds 
t.start() 
p.wait() 

我phantomjs腳本(工作正在進行中):

var page = require('webpage').create(); 
page.includeJs("http://localhost/jquery.js",function(){ 
    phantom.exit(); 
}); 
+1

如果你可以更新到Python 3.3,[subprocess](http://docs.python.org/3/library/subprocess.html)模塊的函數獲得了一個可以自動執行此操作的'timeout'參數。 – bbayles

回答

1

我認爲你的問題可能是p.communicate()將 「Wait for process to terminate」,這意味着你的計時器實際上從未如果腳本掛起,就可以開始。

移動你的通話到定時器啓動後進行通信(並在kill_proc函數中將process.kill()更改爲p.kill()),我認爲它會做你想做的。

正如我上面的評論所提到的,Python 3.3的子進程模塊函數有一個超時參數,它使得這一切都自動發生。

+0

exactamundo! Upvoted您的評論,因爲你的2個建議,每個工作。 – kristen