我正在使用Python 2.6中的GUI前端,通常它非常简单:使用subprocess.call()
或subprocess.Popen()
发出命令并等待它完成或对错误做出反应。如果您的程序停止并等待用户交互,您会怎么做?例如,程序可能会停止并询问用户是否有ID和密码或如何处理错误?
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
到目前为止,我所阅读的所有内容都告诉您如何只在 之后读取程序中的所有输出,而不是在程序仍在运行时如何处理输出。我无法安装新模块(这适用于LiveCD),而且我将不止一次处理用户输入。
答案 0 :(得分:26)
查看subprocess手册。您有subprocess
选项可以将您正在呼叫的流程的stdin
,stdout
和stderr
重定向到您自己的流程。
from subprocess import Popen, PIPE, STDOUT
p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
grep_stdout = p.communicate(input='one\ntwo\nthree\nfour\nfive\nsix\n')[0]
print grep_stdout
您还可以逐行与流程进行交互。鉴于此为prog.py
:
import sys
print 'what is your name?'
sys.stdout.flush()
name = raw_input()
print 'your name is ' + name
sys.stdout.flush()
您可以通过以下方式逐行与之互动:
>>> 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'