2014-10-28 3 views
0

Я хотел бы записать в файл стандартный вывод дочерним процессом Process, порожденным внешним пакетом.Захват стандартного вывода для ребенка Python, порожденного внешним пакетом

Я НЕ могу просто перенаправить файл sys.stdout в файл, так как это не отображает вывод новых процессов (How can I capture the stdout output of a child process?).

Но, к сожалению, я также не могу просто использовать подпроцесс или терминал для захвата stdout, так как я не создаю процесс - он генерируется кодом во внешнем пакете Python.

В частности, я использую API для пакета pystan. Некоторые из функций этого пакета порождают дочерние MCMC-программы, которые записывают на стандартный вывод.

ответ

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