捕获外部包生成的Python子级的标准输出

捕获外部包生成的Python子级的标准输出,python,Python,我希望在文件中捕获由外部包生成的子进程的标准输出 我不能简单地将sys.stdout重定向到一个文件,因为这不会捕获新进程()的输出 但不幸的是,我也不能简单地使用subprocess或终端来捕获stdout,因为我不是在生成进程——它是由外部Python包中的代码生成的 具体地说,我正在使用API编写pystan包。此包中的某些函数生成写入标准输出的子MCMC运行。我只看到两种方法: 猴子补丁pystan(可能需要几个补丁) monkey patch子流程(可能会获得比您想要的更多的信息)

我希望在文件中捕获由外部包生成的子进程的标准输出

我不能简单地将sys.stdout重定向到一个文件,因为这不会捕获新进程()的输出

但不幸的是,我也不能简单地使用subprocess或终端来捕获stdout,因为我不是在生成进程——它是由外部Python包中的代码生成的


具体地说,我正在使用API编写pystan包。此包中的某些函数生成写入标准输出的子MCMC运行。

我只看到两种方法:

  • 猴子补丁
    pystan
    (可能需要几个补丁)
  • monkey patch
    子流程
    (可能会获得比您想要的更多的信息)
我会使用
子流程
猴子补丁:编写自己版本的
Popen
(或任何
pystan
正在使用的
子流程
版本,并用自己的版本替换
子流程。您的版本将跟踪
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