代码之家  ›  专栏  ›  技术社区  ›  Wyrmwood

subprocess.poll的Python语法错误

  •  0
  • Wyrmwood  · 技术社区  · 12 年前

    我今天遇到了这个问题,并设法用这个小的脚本存根重复了它,在win7x64机器上使用python2.7.6运行,但这个问题出现在一个更大的脚本中,在各种windows平台上使用可移植的python

    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 回复  |  直到 12 年前
        1
  •  1
  •   dano    12 年前

    我不知道 SyntaxError 在pdb中是关于的,但这:

    while not p.poll():
        print 'process still running'
        sleep(10)
    

    如果 returncode 属于 p 为0,这是一个很好的可能性。

    请改用此选项:

    while p.poll() is None:
        print 'process still running'
        sleep(10)