Python子流程和用户交互

Dav*_*ker 27 python command-line frontend subprocess popen

我正在使用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
Run Code Online (Sandbox Code Playgroud)

到目前为止,我所阅读的所有内容都告诉您如何在程序完成后才读取程序的所有输出,而不是在程序运行时如何处理输出.我无法安装新模块(这是一个LiveCD),我将不止一次处理用户输入.

Mik*_*ike 30

查看子流程手册.你有选择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
Run Code Online (Sandbox Code Playgroud)

您还可以逐行与流程进行交互.鉴于此prog.py:

import sys
print 'what is your name?'
sys.stdout.flush()
name = raw_input()
print 'your name is ' + name
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式逐行进行交互:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

  • 噢,我已经将子程序手册作为我的主页在三台不同的计算机上使用了几周.对于我需要做的事情来说,它要么太具体,要么太笼统.它还具体说不使用stdin.write,stdout.read或stderr.read,这增加了我的困惑.我在Stack Overflow,Google,Bing和DuckDuckGo上搜索的内容非常少,这与我的需求无关.从观看次数和投票数量来看,这似乎不是经常出现的主题. (2认同)