Python - 在Windows上运行一个带提示I/O的简单命令行程序并进行"代理
我有一个简单的命令行程序 hello
,它会在屏幕上输出:
What is your name?
然后等待用户输入。收到输入后,它会输出:
Hello, [name]!
然后程序结束。
我想用Python来处理这个程序最后的输出("Hello, [name]!"
),但在得到最终输出之前,我希望Python脚本能够“代替”这个二进制程序。换句话说,我希望Python能把所有的提示信息转发到屏幕上,然后接受用户的输入,并把这个输入传给程序。不过,我想隐藏最后的输出,这样我就可以处理它并向用户展示我自己的结果。我不想在脚本中重复 hello
的行为,因为这个简单的程序只是我正在处理的一个更复杂程序的替代品。
我希望在 subprocess
中能有某种机制,让我可以做类似这样的事情:
while process.is_running():
next_char = process.stdout.read(1)
if next_char == input_prompt_thing: # somehow check if the program is waiting for input
user_input = raw_input(buffer)
process.stdin.write(user_input)
else:
buffer += next_char
我一直在尝试使用 subprocess
,基本上我发现可以用 process.stdout.read(1)
从程序中读取数据,但我不知道怎么在程序阻塞我的Python脚本之前打破这个循环。我对控制台输入输出不太熟悉,这方面也不是我的强项,所以我开始感到有些迷茫。非常感谢任何帮助!
1 个回答
1
你可以试试 winpexpect
这个工具(不过我没测试过):
import re
from winpexpect import winspawn
p = winspawn('hello')
prompt = "What is your name?"
p.expect(re.escape(prompt))
name = raw_input(prompt)
p.sendline(name)
p.expect("Hello, .*!")
output = p.after
# ...