上下文:
我正在使用python 2.7.5。
我需要从python脚本运行一个子进程,等待其终止并获得输出。
子进程运行了大约1000次。
为了运行子进程,我定义了一个函数:
def run(cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = p.communicate()
return (p.returncode, stdout, stderr)
要执行的子过程是bash脚本,并作为cmd
函数的run()
参数传递。该命令及其参数通过列表给出(Popen()
期望)。
问题:
过去,它一直没有任何错误。但是最近,在成功执行许多调用之后,python脚本始终卡在子流程调用中。有问题的子进程根本不会执行(bash脚本甚至没有启动),并且python脚本块。
用Ctrl + C停止执行后,我发现它被卡住了:
[...]
File "import_debug.py", line 20, in run
(stdout, stderr) = p.communicate()
File "/usr/lib64/python2.7/subprocess.py", line 800, in communicate
return self._communicate(input)
File "/usr/lib64/python2.7/subprocess.py", line 1401, in _communicate
stdout, stderr = self._communicate_with_poll(input)
File "/usr/lib64/python2.7/subprocess.py", line 1455, in _communicate_with_poll
ready = poller.poll()
KeyboardInterrupt
我不明白为什么会有这个问题,也不知道如何解决。
我发现this SO thread似乎可以解决相同的问题或等效的问题(因为键盘中断后的输出是相同的,但没有答案。
问题:这是怎么回事?我想念什么?如何解决这个问题?
编辑:
该电话采用以下格式:
(code, out, err) = run(["/path/to/bash_script.sh", "arg1", "arg2", "arg3"])
print out
if code:
print "Failed: " + str(err)
bash脚本正在对数据进行一些基本处理(解压缩档案并对提取的数据进行处理)。
我无法提供有关公司隐私问题的确切命令,参数和内容。
[您指的原始主题的作者说:“如果我设置为stderr=None
而不是stderr=subprocess.PIPE
,则永远不会看到此问题。” -建议您完全这样做,并使脚本正常工作。