Как перенаправить stdout для подпроцесса?

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() инициализирует процесс (исполняемый файл) по умолчанию после первой итерации.

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

proc.stdout = proc_log

3 ответов


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

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

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

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

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


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

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


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

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