2016-06-13 5 views
2

Предположим, что есть программа с именем «ABC», которая считывает 4 целых числа из stdin и делает с ними что-то.subprocess.Popen - перенаправить stdin снова

Недавно я leanred, что мы можем использовать трубопровод, чтобы накормить входы в ABC, как следующее:

# send.py 
import subprocess 

p = subprocess.Popen(['ABC'], stdin = subprocess.PIPE) 
print >>p.stdin, '1 2 3 4' 

Мой вопрос: можем ли мы перенаправить стандартный ввод снова после вызова subprocess.Popen ?? Например,

# send.py 
import subprocess 

p = subprocess.Popen(['ABC'], stdin = subprocess.PIPE) 
print >>p.stdin, '1 2 3' 

(Redirect p.stdin to terminal's stdin) 

, так что мы можем ввести четвертое целое число в ABC, напечатав на терминале.

+1

Вы хотите, чтобы 'send.py' читал из stdin, а затем записывался в stdin' ABC'? Да, вы можете это сделать абсолютно. И это не называется «перенаправление» в этом случае - каждая программа имеет свой собственный stdin. Используйте 'input()' или 'sys.stdin.read()'. –

ответ

1

Перенаправление происходит до ABC выполняется, например, (на Unix) после fork() но перед execv() (look at dup2() calls). Слишком поздно использовать тот же механизм уровня ОС для перенаправления после того, как Popen() вернется, но вы можете эмулировать его вручную.

Для «перенаправить p.stdin на стандартный ввод терминала» в то время как процесс запущен, вызовите shutil.copyfileobj(sys.stdin, p.stdin). Могут быть проблемы с буферизацией, и дочерний процесс может читать вне его стандартного ввода, например, непосредственно из tty. См Q: Why not just use a pipe (popen())?

Вы, вероятно, хотите что-то вроде pexpect's .interact() (не тестировался):

#!/usr/bin/env python 
import pexpect # $ pip install pexpect 

child = pexpect.spawnu('ABC') 
child.sendline('1 2 3') 
child.interact(escape_character=None) # give control of the child to the user 
1

Вы можете задать для четвертого целого фронт, а затем отправить его в вместе с другими 3:

p = subprocess.Popen(['ABC'], stdin=subprocess.PIPE) 
fourth_int = raw_input('Enter the 4th integer: ') 
all_ints = '1 2 3 ' + fourth_int 
p.communicate(input=all_ints) 
+0

нет причин просить 4-е целое число перед отправкой другого 3: 'p.stdin.write ('1 2 3 \ n'); 4th = raw_input ('4th int:'); p.stdin.write (четвертый); p.stdin.close() ' – jfs

+0

@ J.F.Sebastian - Вы правы. Шахта - это один из способов получить работу. Это не единственный способ. –

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

  • Нет связанных вопросов^_^