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()
.