为外部程序包产生的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