Как перенаправить 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/