2013-06-17 11 views
0

Я пытаюсь использовать subprocess для обработки потоков. Мне нужно записать данные в поток и уметь читать с него асинхронно (до того, как программа умрет, потому что у меня будет минут, чтобы завершить, однако выход ее продукции).Обработка stdin и stdout

Для случая узнать, я был с помощью команды timeout с Windows 7:

import subprocess 
import time 

args = ['timeout', '5'] 
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False) 
p.stdin.write('\n') # this is supposed to mimic Enter button pressed event. 

while True: 
    print p.stdout.read() # expected this to print output interactively. This actually hungs. 
    time.sleep(1) 

Где я ошибаюсь?

ответ

3

Эта линия:

print p.stdout.read() # expected this to print output interactively. This actually hungs. 

висит, потому что read() означает "читать все данные до конца файла". См. the documentation. Кажется, что вам, возможно, захотелось прочитать строку за раз:

print p.stdout.readline() 
+0

Он считывает данные до EOF буфера. Он не будет висел, если буфер пуст. – iTayb

+1

@iTayb Нет, он ждет окончания файла. Для конца файла конца файла происходит процесс закрытия ввода или завершения процесса ввода-вывода. EOF не происходит просто потому, что процесс временно прекращает запись. Попробуйте, например. запуск 'python -c" import sys; print sys.stdin.read() "' и посмотреть, отражает ли это только первую строчку, которую вы пишете, или каждую строку, которую вы пишете, указав EOF с помощью Ctrl-Z/Ctrl-D/аналогичного , – svk