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

时间:2014-10-28 20:57:20

标签: python

我想在一个文件中捕获由外部包产生的子进程的标准输出。

我不能简单地将sys.stdout重定向到文件,因为这不会捕获新进程的输出(How can I capture the stdout output of a child process?)。

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

具体来说,我正在使用API​​来包装pystan。此程序包spawn子MCMC中的某些函数运行写入标准输出。

1 个答案:

答案 0 :(得分:0)

我只看到两种方法:

  • monkey-patch pystan(可能需要多个补丁)
  • monkey-patch 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