现在我有一些代码使用来自子进程的Popen.communicate()(设置 stdin=PIPE
和 stderr=PIPE
)来运行命令并捕获stderr和stdout .
问题是 communicate()
不仅等待命令退出,它还等待stdout和stderr关闭 . 我正在运行的命令会生成一个子进程,它会使stderr保持打开状态,所以即使命令运行完毕(并在ps中显示为"defunct"), communicate()
仍然挂起 .
我想只等待命令完成而不等待stderr / stdout . 但我仍然希望捕获命令运行时给出的任何stderr / stdout输出 . The documentation for wait()附有一个带免责声明的红色框:
当使用stdout = PIPE和/或stderr = PIPE时,这将导致死锁,并且子进程会为管道生成足够的输出,以便阻止等待OS管道缓冲区接受更多数据 . 使用communic()来避免这种情况 .
显然,我也想避免陷入僵局 .
完成这项任务的正确方法是什么?
2 回答
"shows as " defunct " in ps"意味着您可能位于
select
或fcntl
可以工作的系统上,即您可以轻松读取stdout / stderr而不会阻塞 .示例:A启动B(
cmd
,孩子),B启动C(孙子),A读取输出直到B退出或EOF:哪里
cmd
:我试过一个简单的例子 . 到目前为止我所拥有的只是捕获std.err我创建了两个文件 . 第一个的内容是(example1.py):
第二个内容(example2.py):
我刚刚调用了example2.py脚本:
python example2.py我实时输出(我认为它是真的:)):
不过,我不知道如何处理标准输出,但如果我管理它,我会在这里发布答案