I’m working on a GUI front end in Python 2.6 and usually it’s fairly simple: you use subprocess.call()
or subprocess.Popen()
to issue the command and wait for it to finish or react to an error. What do you do if you have a program that stops and waits for user interaction? For example, the program might stop and ask the user for an ID and password or how to handle an error?
c:> parrot
Military Macaw - OK
Sun Conure - OK
African Grey - OK
Norwegian Blue - Customer complaint!
(r) he's Resting, (h) [Hit cage] he moved, (p) he's Pining for the fjords
So far everything I’ve read tells you how to read all output from a program only after it’s finished, not how to deal with output while the program is still running. I can’t install new modules (this is for a LiveCD) and I’ll be dealing with user input more than once.
Advertisement
Answer
Check out the subprocess manual. You have options with subprocess
to be able to redirect the stdin
, stdout
, and stderr
of the process you’re calling to your own.
from subprocess import Popen, PIPE, STDOUT
p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
grep_stdout = p.communicate(input='onentwonthreenfournfivensixn')[0]
print grep_stdout
You can also interact with a process line by line. Given this as prog.py
:
import sys
print 'what is your name?'
sys.stdout.flush()
name = raw_input()
print 'your name is ' + name
sys.stdout.flush()
You can interact with it line by line via:
>>> from subprocess import Popen, PIPE, STDOUT
>>> p = Popen(['python', 'prog.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
>>> p.stdout.readline().rstrip()
'what is your name'
>>> p.communicate('mike')[0].rstrip()
'your name is mike'
EDIT: In python3, it needs to be 'mike'.encode()
.