假设您有一个大型脚本,它在许多地方都直接写入 stdout(使用 Python 功能,如 print()
或 logging
到 stdout
) 并间接启动写入标准输出的 subprocess
es。
是否有一种简单的方法来捕获所有这些标准输出?
例如,如果您希望脚本在完成时发送一封包含所有输出的电子邮件。
我所说的“微不足道”是指常量而不是线性代码更改。否则,我相信您将不得不在每个 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/