2016-10-06 2 views
0

Этот вопрос не является дубликатомСвязь несколько раз с подпроцесс в Python

Communicate multiple times with a process without breaking the pipe?

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


Документ subprocess.Popen говорит:

communicate(input=None) 
    Interact with process: Send data to stdin. Read data from stdout 
    and stderr, until end-of-file is reached. Wait for process to 
    terminate. ... 

Можно ли общаться несколько раз с подпроцессом до его окончания, как с терминалом или с сетевой розеткой?

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

ответ

1

Основном Non-blocking read on a subprocess.PIPE in python

Установите Proc трубы (proc.stdout, proc.stdin, ...) в режиме неблокирующем с помощью fnctl, а затем записывать/считывать их непосредственно.

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

0

Это оказывается не очень сложно:

proc = subprocess.Popen(['bc'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
os.write(proc.stdin.fileno(), b'100+200\n') 
print(os.read(proc.stdout.fileno(), 4096)) 
Смежные вопросы