python - 您如何简单地更改 Python 脚本以捕获由其自身及其子进程写入 stdout 的所有内容?

标签 python subprocess

假设您有一个大型脚本,它在许多地方都直接写入 stdout(使用 Python 功能,如 print()loggingstdout ) 并间接启动写入标准输出的 subprocesses。

是否有一种简单的方法来捕获所有这些标准输出?

例如,如果您希望脚本在完成时发送一封包含所有输出的电子邮件。

我所说的“微不足道”是指常量而不是线性代码更改。否则,我相信您将不得不在每个 subrprocess 调用中引入重定向参数(和一些累积逻辑)。您可以通过重定向 sys.stdout 捕获脚本本身的所有输出,但是我没有看到针对所有 subprocess 调用的类似“包罗万象”的简单解决方案,或者您可能用来启动这些子进程的任何其他类型的代码。

是否有任何这样的解决方案,或者必须使用运行器脚本将此 Python 脚本作为子进程调用并从该子进程捕获所有 stdout

最佳答案

可能最短的方法是使用 os.dup2(),而不是特定于 python 的例如:

f = open('/tmp/OUT', 'w')
os.dup2(f.fileno(), 1)
f.close()

它的作用是替换文件描述符 1,这通常是您的 stdout。使用 f 的文件描述符(然后您可以关闭)。之后所有写入 stdout/tmp/OUT。这种重复是可继承的,子进程有 fd 1 写入同一个文件。

关于python - 您如何简单地更改 Python 脚本以捕获由其自身及其子进程写入 stdout 的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58140580/

相关文章:

python - 安装更新cheetah时出现问题==2.4.4

python - 如何突然终止正在进行的处理

python:杀死 child 或报告他们成功的简单方法?

python - 子进程打开以运行命令(HDFS/hadoop)

python - C 到 Python 代码转换(打印类似地址的值)

python - 图像处理算法设计 : how to get front images from an angled camera?

Python 多处理队列可靠性,Queue vs SimpleQueue vs JoinableQueue

python - 如何创建一个可以下载目录文件的 Python HTTP 服务器

java - 在没有第三方库的情况下从Python启动JVM?

java - python子进程调用java类时出错