2013-05-16 3 views
2

У меня есть простой echoprocess.py:Связь с подпроцесса, не дожидаясь подпроцесса прекратить на окнах

import sys 

while True: 
    data = sys.stdin.read() 
    sys.stdout.write("Here is the data: " + str(data)) 

И в parentprocess.py

from subprocess import Popen, PIPE 

proc = Popen(["C:/python27/python.exe", "echoprocess.py"], 
      stdin = PIPE, 
      sdtout = PIPE) 

proc.stdin.write("hello") 
print proc.stdout.read() 

Это просто висит, пока не echoprocess.py прекращается. Я хочу общаться с этим подпроцессом несколько раз, не перезагружая его снова. Возможно ли такое межпроцессное взаимодействие с модулем подпроцесса Python в Windows?

+0

Только что добавили примечание относительно буферизации вывода к моему ответу. Не уверен в Windows, но в Linux нужен тот, который находится в 'echoprocess.py', хотя тот, что находится в' parentprocess.py', не является. Обычно безопаснее всегда включать их для максимальной переносимости. – Aya

+0

Возможно, стоит обратить внимание на модуль ['multiprocessing'] (http://docs.python.org/2/library/multiprocessing.html), который обеспечивает уровень абстракции для такого рода межпроцессорной коммуникации. – Aya

+0

Это то, что я сделал изначально, но у меня были некоторые начальные проблемы с ним в Windows. Требование Windows поместить весь весь код в блок 'if __name__ ==" __main __ ":' казалось, требует слишком много работы вокруг того, что у меня уже есть. –

ответ

3

Основная проблема с линией ...

print proc.stdout.read() 

read() метод при использовании каких-либо параметров будет считывать все данные до EOF, которые не будут происходить до тех пор, пока подпроцесс завершается.

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

proc.stdin.write("hello\n") 
print proc.stdout.readline() 

... в противном случае вам придется работать некоторые другие средства разграничения «сообщения ».

Вы должны сделать аналогичные изменения в echoprocess.py, то есть изменения ...

data = sys.stdin.read() 

... до ...

data = sys.stdin.readline() 

Вы также можете иметь проблемы с буферизацией вывода , поэтому может понадобиться flush() буфер после записи.


Собираем все это вместе, если изменить echoprocess.py к ...

import sys 

while True: 
    data = sys.stdin.readline() 
    sys.stdout.write("Here is the data: " + str(data)) 
    sys.stdout.flush() 

... и parentprocess.py к ...

from subprocess import Popen, PIPE 

proc = Popen(["C:/python27/python.exe", "echoprocess.py"], 
      stdin = PIPE, 
      stdout = PIPE) 

proc.stdin.write("hello\n") 
proc.stdin.flush() 
print proc.stdout.readline() 

... она должна работать как вы ожидаете.

+0

Работает как и ожидалось. Что именно делает флеш? –

+1

@MichaelDavidWatson. Для эффективности процессы обычно имеют внутренний буфер, и вызовы 'write()' фактически будут храниться в буфере до тех пор, пока он не достигнет определенного размера, после чего он будет передан в процесс с каналами , Вызов 'flush()' заставляет это немедленно произойти, а не ждать заполнения буфера. Там где-то есть лучшее описание в Интернете. – Aya

Смежные вопросы