背景:
我正在使用 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脚本,并作为
run()
函数的cmd
参数传递。命令及其参数通过列表给出(如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
我不明白为什么会出现这个问题,也不知道如何解决它。
我找到了这个SO帖子,似乎处理的是相同或等价的问题(因为键盘中断后的输出结果相同),但没有答案。
问题:这里发生了什么?我错过了什么?如何解决这个问题?
编辑:
调用方式如下:
(code, out, err) = run(["/path/to/bash_script.sh", "arg1", "arg2", "arg3"])
print out
if code:
print "Failed: " + str(err)
这个bash脚本正在对数据进行基本处理(解压缩归档文件并对提取的数据执行某些操作)。当错误发生时,所有bash脚本指令都不会被执行。
我不能提供确切的命令、参数和内容,因为涉及公司隐私问题。
cmd
的内容是什么? - prithajnath