我今天遇到了这个问题,并设法用这个小的脚本存根重复了它,在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的尝试都会产生相同的错误,但同样,只有在调试器中。