2012-06-12 51 views
2

如果使用子進程在linux上執行一個xterm,然後又執行一些其他進程,Python(2.6.5)似乎永遠不會意識到進程(xterm)已經完成執行。xterm python subprocess

考慮下面的代碼:

import subprocess 
import shlex 
import time 

proc = subprocess.Popen(shlex.split('xterm -iconic -title "FOO_BAR" -e sleep 5')) 
while True: 
    if proc.poll(): 
     print 'Process completed' 
    time.sleep(0.1) 

這將無限循環播放,直到停止Python解釋器。我猜測這可能是由於xterm的一些奇怪造成的,並不是Python子進程模塊的直接原因,但也許還有其他一些聰明人可以揭示這種情況。

注意:調用proc.communicate()實際上將在xterm完成時返回,但由於某種原因,輪詢方法將不起作用。

回答

3

,該程序不能區分proc.poll()None之間返回(這意味着該過程仍在運行)和proc.poll()返回0(意味着該過程終止的零退出值,以往指示成功完成)。改變這一行:

if proc.poll(): 

這樣:

if proc.poll() is not None: 

,看看有沒有什麼幫助。

+2

使用'is'作爲單例如'None' – jfs

+0

我不敢相信我在使用poll函數時犯了這個基本錯誤。謝謝你的「頭頂」:-) –

+0

@ J.F.Sebastian Ha,是的,對不起 - 舊的C習慣很難死。我已經更新了答案。 – ottomeister