Python子进程陷入了communication()调用

时间:2020-01-02 15:02:32

标签: python linux python-2.7 subprocess

上下文:

我正在使用 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)

要执行的子流程是一个脚本,并作为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脚本正在对数据进行一些基本处理(解压缩档案并对提取的数据进行处理)。
发生错误时,不会执行任何bash脚本指令。

我无法提供有关公司隐私问题的确切命令,参数和内容。

1 个答案:

答案 0 :(得分:2)

您所引用的原始线程的作者说:“如果我设置stderr=None而不是stderr=subprocess.PIPE,我将永远不会看到此问题。” -建议您完全这样做,并使脚本正常工作。


在阅读评论部分后添加:

有一些有用的选项,您可能不希望使用:

-f  freshen existing files, create none
-n  never overwrite existing files         
-o  overwrite files WITHOUT prompting    
相关问题