python - 从多个子进程 Popens 一起捕获所有 stderr 数据
问题描述
我Popen
在 Python 2.7 中通过 stdin/stdout 将多个子进程连接在一起,如下所示:
p1 = Popen(shlex.split(cmd1), stdout=sp.PIPE, stderr=sp.PIPE)
p2 = Popen(shlex.split(cmd2), stdin=p1.stdout, stdout=sp.PIPE, stderr=sp.PIPE)
...
pN = Popen(shlex.split(cmdN), stdin=pN-1.stdout, stdout=sp.PIPE, stderr=sp.PIPE)
stdout, stderr = pN.communicate()
一切都按预期进行得非常顺利;但是我想捕获每个不同进程的标准错误,而目前我只能pN
通过pN.communicate()
. 我知道每个 stderr 都可以重定向到不同的文件中,但我想知道是否有任何方法可以在 Python 中的最终通信之后和/或之前捕获所有进程的 stderr?
为不同的进程调用通信总是会导致管道损坏。
编辑-1
communicate
以与管道中相同的顺序调用每个进程是正确且可接受的解决方案吗?
p1 = Popen(shlex.split(cmd1), stdout=sp.PIPE, stderr=sp.PIPE)
p2 = Popen(shlex.split(cmd2), stdin=p1.stdout, stdout=sp.PIPE, stderr=sp.PIPE)
...
pN = Popen(shlex.split(cmdN), stdin=pN-1.stdout, stdout=sp.PIPE, stderr=sp.PIPE)
stdout1, stderr1 = p1.communicate()
stdout2, stderr2 = p2.communicate()
...
stdoutN, stderrN = pN.communicate()
编辑-2
EDIT 1中提出的解决方案是错误的,因为它communicate
在已结束的进程上调用时会产生错误。
目前唯一可行的解决方案似乎是重定向所有已处理文件的 stderr 并在确保所有进程终止后读取这些文件:
map(lambda p : p.wait(), (p1, p2, ..., pN))
解决方案
推荐阅读
- excel - 过滤公式中的列并更正公式
- html - 为什么 span with height: auto 和 display: inline-block parent of svg 的高度比它的 svg child 大?
- php - 是否可以将压缩文件夹从服务器(php)发送到前端(角度)?还是有其他方法可以做到
- json - 如何从 CQL 表中的 JSON 列中选择键作为列?
- java-9 - Java 9 反应式流。为什么需要处理器?
- reporting-services - 根据过滤列过滤/隐藏矩阵中的“空”行
- typescript - d3 在最后一个 x 轴项目上的打字稿填充空间中缩放?
- python - Mosestokenizer 问题:[WinError 2] 系统找不到指定的文件
- c++ - 即使我已经包含了某些标题,也没有找到它们。除了使用引号之外,我该如何解决这个问题?
- liferay-7 - 用自定义替换 top-head.jsp Liferay