【发布时间】:2014-01-15 16:58:20
【问题描述】:
现在我有一些代码使用子进程中的Popen.communicate()(设置stdin=PIPE 和stderr=PIPE)来运行命令并捕获stderr 和stdout。
问题是communicate()不仅等待命令退出,还等待stdout和stderr关闭。我正在运行的命令会生成一个子进程,它使 stderr 保持打开状态,因此即使命令已完成运行(并在 ps 中显示为“已失效”)communicate() 仍然挂起。
我只想等待命令完成而不等待 stderr/stdout。但我仍然想捕获命令运行时给出的任何 stderr/stdout 输出。 The documentation for wait() 附有一个带有免责声明的红框:
这将在使用 stdout=PIPE 和/或 stderr=PIPE 时发生死锁,并且子进程会向管道生成足够的输出,从而阻塞等待 OS 管道缓冲区接受更多数据。使用communicate() 来避免这种情况。
显然,我也想避免死锁。
完成这项任务的正确方法是什么?
【问题讨论】:
-
可以生成单独的线程来读取进程的
stdout和stderr,这样您就可以调用wait()而不必担心缓冲区被填满。复杂的部分是如果你想停止阅读stderr。见stackoverflow.com/questions/3076542/… -
@DanGetz 谢谢,我认为这会奏效。如果我得到可行的解决方案,我会报告。
标签: python subprocess