[假设您有一个很大的脚本,可以在很多地方直接写入stdout,既可以直接(使用print()
或logging
等Python功能,然后转到stdout
),也可以通过启动写入到stdout的subprocess
来间接写入。
是否有简单的方法来捕获所有此标准输出?
例如,如果您希望脚本在完成时发送包含其所有输出的电子邮件。
“平凡”是指常量而不是线性代码更改。否则,我相信您将不得不在每个subrprocess
调用中引入重定向参数(以及一些累加逻辑)。您可以通过重定向sys.stdout
捕获脚本本身的所有输出,但是对于所有subprocess
调用,或者您可能正在使用的任何其他类型的代码,我都看不到类似的“包罗万象”琐碎解决方案启动这些子流程。
是否有任何这样的解决方案,或者必须使用一个运行程序脚本来将该Python脚本称为子进程,并从该子进程捕获所有stdout
?
可能是这样做的最短方法,而不是特定于python的是使用os.dup2()
例如:
os.dup2()
它所做的是替换文件描述符f = open('/tmp/OUT', 'w')
os.dup2(f.fileno(), 1)
f.close()
,该文件描述符通常是您的1
。使用stdout
的文件描述符(然后可以关闭)。之后,所有内容均写入f
和stdout
中。此副本是可继承的,子进程将fd /tmp/OUT
写入同一文件。