您如何平凡地更改Python脚本以捕获本身及其子进程写入标准输出的所有内容?

问题描述 投票:2回答:1

[假设您有一个很大的脚本,可以在很多地方直接写入stdout,既可以直接(使用print()logging等Python功能,然后转到stdout),也可以通过启动写入到stdout的subprocess来间接写入。

是否有简单的方法来捕获所有此标准输出?

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

“平凡”是指常量而不是线性代码更改。否则,我相信您将不得不在每个subrprocess调用中引入重定向参数(以及一些累加逻辑)。您可以通过重定向sys.stdout捕获脚本本身的所有输出,但是对于所有subprocess调用,或者您可能正在使用的任何其他类型的代码,我都看不到类似的“包罗万象”琐碎解决方案启动这些子流程。

是否有任何这样的解决方案,或者必须使用一个运行程序脚本来将该Python脚本称为子​​进程,并从该子进程捕获所有stdout

python subprocess
1个回答
0
投票

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

os.dup2()

它所做的是替换文件描述符f = open('/tmp/OUT', 'w') os.dup2(f.fileno(), 1) f.close() ,该文件描述符通常是您的1。使用stdout的文件描述符(然后可以关闭)。之后,所有内容均写入fstdout中。此副本是可继承的,子进程将fd /tmp/OUT写入同一文件。

© www.soinside.com 2019 - 2024. All rights reserved.