subprocess.Popen () перенаправление ввода-вывода - PullRequest
10 голосов
/ 18 января 2012

Попытка перенаправить вывод подпроцесса в файл.

server.py:

while 1:
    print "Count " + str(count)
    sys.stdout.flush()
    count = count + 1
    time.sleep(1)

Laucher:

cmd = './server.py >temp.txt'
args = shlex.split(cmd)
server = subprocess.Popen( args )

Вывод отобразится на экране,temp.txt остается пустым.Что я делаю не так?

В качестве фона я пытаюсь зафиксировать вывод программы, которая уже была написана.

Я не могу использовать:

server = subprocess.Popen(
                [exe_name],
                stdin=subprocess.PIPE, stdout=subprocess.PIPE)

какпрограмма не может быть сброшена.Вместо этого я собирался перенаправить вывод через fifo.Это прекрасно работает, если я вручную запускаю server.py, но, очевидно, нет, если я Popen(), потому что перенаправление не работает.ps -aux показывает, что server.py был запущен правильно.

Ответы [ 2 ]

9 голосов
/ 18 января 2012

Альтернативно, вы можете использовать параметр stdout с файловым объектом:

with open('temp.txt', 'w') as output:
    server = subprocess.Popen('./server.py', stdout=output)
    server.communicate()

Как объяснено в документации :

stdin,stdout и stderr задают дескрипторы стандартного ввода, стандартного вывода и стандартного файла ошибок исполняемой программы соответственно.Допустимые значения: PIPE, существующий файловый дескриптор (положительное целое число), существующий файловый объект и None.

6 голосов
/ 18 января 2012

Перенаправление вывода с помощью «>» является функцией оболочек - по умолчанию subprocess.Popen не создает экземпляр. Это должно работать:

server = subprocess.Popen(args, shell=True)
...