Взаимодействие подпроцессов Python. Почему мой процесс работает с Popen.communicate, но не с Popen.stdout.read()?

Я пытаюсь общаться с чат-ботом командной строки с Python, используя модуль подпроцесса . (http://howie.sourceforge.net/ с использованием скомпилированного двоичного файла win32, у меня есть свои причины!)

Это работает:

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE)
output = proc.communicate()

Но Popen.communicateожидает завершения процесса (и отправляет EOF?), я хочу иметь возможность взаимодействовать с ним. Очевидным решением для этого было чтение stdout/ запись stdinпримерно так:

Это не работает:

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE)
while True: print proc.stdout.readline()

(Обратите внимание, что на самом деле я использую более сложный код, основанный на на http://code.activestate.com/recipes/440554/, но проблема та же.)

Проблема в том, что второй подход отлично работает для связи с cmd, но когда я запускаю чат-бот, ничего. Итак, мой вопрос: чем это отличается при захвате вывода от использования Popen.communicate()?

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

6
задан SudoNhim 12 March 2012 в 21:13
поделиться