Python - 在Windows上运行一个带提示I/O的简单命令行程序并进行"代理

1 投票
1 回答
950 浏览
提问于 2025-04-17 08:11

我有一个简单的命令行程序 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
# ... 

撰写回答