1

在某些机器上,对于以下代码

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

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

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

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

谢谢。

4

2 回答 2

0

尽量stderr = subprocess.PIPE不要stderr = subprocess.STDOUT

于 2012-07-26T20:17:12.400 回答
0

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

当您调用communicate() 时,它在不同的操作系统下做不同的事情。但它总是等待启动的进程自行退出,例如。调用 p.wait()。p.wait() 仅在进程终止时终止。

解决方案:

  • 您可以复制 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 的来源,您可以在subprocess.__file__.

于 2012-07-26T21:48:36.557 回答