我想在一个文件中捕获由外部包产生的子进程的标准输出。
我不能简单地将sys.stdout重定向到文件,因为这不会捕获新进程的输出(How can I capture the stdout output of a child process?)。
但不幸的是,我也不能简单地使用子进程或终端来捕获stdout,因为我没有产生进程 - 它是由外部Python包中的代码生成的。
具体来说,我正在使用API来包装pystan。此程序包spawn子MCMC中的某些函数运行写入标准输出。
答案 0 :(得分:0)
我只看到两种方法:
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