перенаправление вывода popen в файл на python



Я видел много ответов, которые stdout=file будут перенаправлены в файл. Но у меня была пара вопросов.





  1. Почему не работает >file.



    subprocess.Popen([SCRIPT, "R", ">", FILE, "2>", "/dev/null"])



  2. Это нормально



    with open(FILE,'w+') as f:
    subprocess.Popen([SCRIPT, stdout=f]
    f.close()



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



Делает ли скрипт запись в него даже после закрытия f. Если да, то как это работает?

538   2  

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

    Ничего не найдено.