Как перенаправить 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
6
задан skaffman 29 January 2010 в 11:05
поделиться

2 ответа

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

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

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

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

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

6
ответ дан 9 December 2019 в 22:34
поделиться

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

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

4
ответ дан 9 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: