Python子进程包不报告子进程的错误?

时间:2012-07-19 18:23:03

标签: python linux subprocess

在某些机器上,代码为

p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT);
out, err = p.communicate()

此脚本将挂起p.communicate()并且不会返回。

手动运行命令后,我终于看到了错误消息。

为什么会这样,我该如何解决?

感谢。

2 个答案:

答案 0 :(得分:0)

尝试stderr = subprocess.PIPE而非stderr = subprocess.STDOUT

答案 1 :(得分:0)

我猜你的程序永远不会结束?

当你调用communication()时,它会在不同的操作系统下执行不同的操作。但它始终等待已启动的进程自行退出,例如。调用p.wait()。 p.wait()仅在rocess终止时终止。

解决方案:

  • 您可以复制subprocess.Popen._communicate的源代码并更改它,以便它不使用wait()但是time.sleep和一些超时
  • 编写自己的代码,读取stdout和stderr,如果程序输出太多stderr则停止
  • 您更改了永远不会这样的文件的main()函数

方式

def main():
    ## here is you program code

if __name__ == '__main__':
    import thread, sys, time
    _id = thread.start_new(main, ())
    time.sleep(1)
    t = time.time() + 100 # execute maximum 100 + 1 seconds
    while t > time.time() and _id in sys._current_frames():
        time.sleep(0.001)

如果您想查看子流程的来源,可以在subprocess.__file__找到它。