subprocess.poll的Python语法错误

时间:2014-07-25 01:47:44

标签: python windows subprocess

今天我遇到了这个问题,并设法用win7x64机器上的python 2.7.6运行的这个小脚本重复它,但问题是在更大的脚本中使用便携式python在各种Windows平台上运行

from subprocess import PIPE, Popen
from time import sleep
class Test(object):
    def run_cmd(self, cmd, wait=True):
        p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
        if wait:
            p.communicate()
            return p
        else:
            return p
    def something(self):
        p = self.run_cmd('notepad', wait=False)
        import pdb; pdb.set_trace()
        while not p.poll():
            print 'process still running'
            sleep(10)
        print p.returncode, p.stdout, p.stderr
    def somethingelse(self):
        p = self.run_cmd('notepad')        
        print p.returncode, p.stdout, p.stderr

t = Test()
t.somethingelse()
t.something()

会发生什么,somethingelse在前台启动一个进程,python脚本等待它退出并打印返回代码,stdout和stderr,但是在第二次调用中,某个过程启动了,但是否是你结束这个过程,python停留在循环中。然后我添加了pdb步骤,这是输出,

>>> t.something()
> <stdin>(12)something()
(Pdb) print p
<subprocess.Popen object at 0x0000000002D73D68>
(Pdb) p.poll()
*** SyntaxError: SyntaxError('invalid syntax', ('<string>', 1, 1, '.poll()'))
(Pdb)

轮询,而不是在进程打开时返回None,并在完成后设置/返回返回代码,总是返回None,只在调试器中有附加输出。该流程已启动并按预期运行。知道我在做什么导致subprocess.poll返回'无效语法'?这很奇怪,因为它不会抛出异常,它只是永远不会更新以返回返回代码,并且任何打印p.pid,p.stdin,p.stdout的尝试都会产生相同的错误,但同样,仅在调试器中。

1 个答案:

答案 0 :(得分:1)

我不确定pdb中的SyntaxError是什么,但是这个:

while not p.poll():
    print 'process still running'
    sleep(10)
如果returncode的{​​{1}}为0,

将进入无限循环,这很有可能。

请改用:

p