перенаправление вывода popen в файл на python
Я видел много ответов, которые stdout=file будут перенаправлены в файл. Но у меня была пара вопросов.
Почему не работает
>file.
subprocess.Popen([SCRIPT, "R", ">", FILE, "2>", "/dev/null"])
Это нормально
with open(FILE,'w+') as f:
subprocess.Popen([SCRIPT, stdout=f]
f.close()
В моем случае я пытаюсь запустить скрипт в бесконечном цикле (который не останавливается), и есть некоторые другие процессы, контролирующие его выход.
Делает ли скрипт запись в него даже после закрытия f. Если да, то как это работает?
2 ответов:
Потому что
subprocessне позволяет использовать>для перенаправления ни вывода, ни сообщения об ошибке из документа:
stdin,stdoutиstderrукажите стандартные входные, выходные и выходные дескрипторы файлов ошибок выполняемой программы соответственно. Допустимые значения:PIPE,DEVNULL, существующий файловый дескриптор (положительное целое число), существующий файловый объект иNone.
PIPEуказывает, что новый канал для дочернего элемента должен быть создан.DEVNULLуказывает, что будет использоваться специальный файлos.devnull. С настройками по умолчаниюNoneперенаправление не произойдет; дескрипторы дочерних файлов будут унаследованы от родительского.Кроме того,
stderrможет бытьSTDOUT, что указывает на то, что данные stderr из приложений должны быть записаны в тот же дескриптор файла, что и дляstdout.
И вы должны использовать следующий код:
with open(FILE, 'w+') as f: subprocess.Popen([SCRIPT, 'R'], stdout=f, stderr=subprocess.DEVNULL))Потому что вы используете
with, так что нет необходимости закрывать файл.
Я думаю, вы должны попробовать,
with open(FILE,'w+') as f: subprocess.Popen([SCRIPT, stdout=f, stderr=f])
Comments