Как перенаправить стандартный вывод для подпроцесса? - PullRequest
6 голосов
/ 29 января 2010
def StartProc(dir, parm):
    global proc    

    proc_log = open(dir + os.sep + "MyLog.txt","w")  #new path for each file

    if parm:
        proc = subprocess.Popen(path, 0, None, subprocess.PIPE, proc_log, None)
    else:
        MyReset(proc)                     #reset the process(proc) to its default values
        proc.stdout = proc_log            #no effect
        print "fptr ", proc.stdout
    #endif
#enddef

prm = True

for i in range(0, 5):
    StartProc(i, prm)
    prm = False
#endfor

Я хочу запустить исполняемый файл только один раз, но на каждой итерации я хочу перенаправить вывод процесса в другой файл. Происходит следующее: файлы создаются по другому пути, но выходные данные перенаправляются в файл, который создается впервые.

Примечание: MyReset() инициализирует процесс (исполняемый файл) его значениями по умолчанию после первой итерации.

Изменит ли следующая строка стандартный вывод процесса на новый файл?

proc.stdout = proc_log

Ответы [ 3 ]

6 голосов
/ 29 января 2010

Как сказано выше, вы не можете изменить дескриптор файла, в который дочерний процесс записывает свой вывод.

Что вы можете сделать, это прочитать выходные данные дочернего процесса в вашем скрипте Python и затем записать его обратно в любой файл, который вы хотите. E.g.:

proc = subprocess.Popen(path, 0, None, subprocess.PIPE, subprocess.PIPE, None)

for l in proc.stdout.readlines():
  output_file.write(l)

Очевидно, вам нужно выяснить, как должен вести себя элемент управления в вашем приложении, т.е. можете ли вы писать из основного потока, когда основной поток должен вернуться из StartProc() в этом случае, или вам нужно выполните запись из другого потока, чтобы основной поток мог немедленно вернуться из StartProc().

4 голосов
/ 29 января 2010

Вы не можете. Как только процесс запущен, его стандартный вывод - это ничто, что вы можете изменить извне. Вам нужно попасть в пространство этого процесса, чтобы заглушить его файловые дескрипторы.

Если у вас есть способ (в MyReset(), я полагаю), чтобы поговорить с запущенным процессом, возможно, вы сможете придумать способ передать новое имя файла, чтобы он (повторно) открывался как его стандартный вывод. *

1 голос
/ 28 декабря 2010

В python есть тонкие проблемы / ошибки, связанные с подпроцессом. ТРУБА: http://bugs.python.org/issue1652

Очевидно, это было исправлено в python3 +, но не в python 2.7 и старше. Для этого вам нужно использовать: code.google.com/p/python-subprocess32/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...