Python子流程与用户交互

2024-04-29 19:40:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在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),我将处理用户输入不止一次。


Tags: 用户命令程序id密码错误guiok
1条回答
网友
1楼 · 发布于 2024-04-29 19:40:09

查看subprocess手册。您可以使用subprocess选项将您调用的进程的stdinstdoutstderr重定向到您自己的进程。

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

您可以通过以下方式与it部门进行逐行交互:

>>> 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'

编辑:在python3中,它必须是'mike'.encode()

相关问题 更多 >