为外部程序包产生的Python子进程捕获标准输出
问题描述:
我想在文件中捕获由外部程序包产生的子进程的标准输出。为外部程序包产生的Python子进程捕获标准输出
我不能简单地将sys.stdout重定向到一个文件,因为它不捕获新进程的输出(How can I capture the stdout output of a child process?)。
但不幸的是,我也不能简单地使用子进程或终端来捕获stdout,因为我没有产生这个进程 - 它是由外部Python包中的代码产生的。
具体来说,我使用API pystan。此包中的一些函数产生子MCMC运行,写入标准输出。
答
我只看到两种方法可以做到这一点:
- 猴子补丁
pystan
(可能需要几个补丁) - 猴子补丁
subprocess
(可能会比您想了解更多信息)
我会用subprocess
猴子补丁:写你自己的版本Popen
(或任何pystan
正在使用,并用您自己的版本替换subprocess
版本。您的版本将跟踪STDOUT
并将其保存在您可能会遇到的地方。
粗略地说,这样的事情:
import subprocess
original_Popen = subprocess.Popen
def my_Popen(..., stdout=PIPE, ...): # or somesuch
...
subprocess.Popen = my_Popen
# call pystan here
subprocess.Popen = original_Popen # if needed