2012-06-12 50 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