在Python中与其他命令行程序交互

8 投票
2 回答
14896 浏览
提问于 2025-04-15 12:23

我需要写一个Python脚本,这个脚本可以运行另一个命令行程序,并与它的输入输出流进行互动。简单来说,Python脚本会从目标命令行程序读取数据,聪明地通过写入它的输入流来做出回应,然后再从程序中读取结果。(这个过程会不断重复。)

我查阅了subprocess模块,但似乎无法实现我想要的那种读/写/读/写的功能。我还应该尝试其他什么吗?

2 个回答

4

请查看这个问题:wxPython: 如何创建一个bash shell窗口?

在这里,我展示了如何与bash shell进行完整的互动,包括读取标准输出(stdout)和标准错误(stderr),以及通过标准输入(stdin)进行通信。

主要部分是这个代码的扩展。

bp = Popen('bash', shell=False, stdout=PIPE, stdin=PIPE, stderr=PIPE)
bp.stdin.write("ls\n")
bp.stdout.readline()

如果我们读取所有数据,程序会被阻塞,所以我提供的脚本链接是通过线程来处理的。这是一个完整的wxPython应用程序,部分模拟了bash shell的功能。

7

要实现这种详细的交互(当其他程序在你控制之外可能会缓冲它的输出,除非它认为自己是在和终端对话),需要用到像 pexpect 这样的工具。这个工具又需要用到 pty,这是一个Python的标准库模块,在允许的操作系统上(比如Linux和Mac OS X)可以实现“伪终端”。

在Windows上情况就比较复杂,不过也许 这个压缩文件 能帮上忙——它应该是 pexpect 在Windows上的一个移植版本(抱歉,我没有Windows机器来验证)。这个项目叫做 wexpect,可以在 这里 找到。

撰写回答