今天我遇到了这个问题,并设法用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的尝试都会产生相同的错误,但同样,仅在调试器中。
答案 0 :(得分:1)
我不确定pdb中的SyntaxError
是什么,但是这个:
while not p.poll():
print 'process still running'
sleep(10)
如果returncode
的{{1}}为0,将进入无限循环,这很有可能。
请改用:
p