用Python控制终端应用程序

6 投票
2 回答
8160 浏览
提问于 2025-04-16 15:59

我有一个通过控制台运行的服务器程序。(具体来说,是Bukkit的Minecraft服务器)我想控制这个程序并读取它的输出。因为没有图形界面,所以这应该不难,对吧?

不过,我从来没有在Python中控制过控制台,现在完全不知道该怎么做。有什么建议吗?

附注:我使用的是Debian Linux,这应该能简化一些事情。

我得到了一个不错的答案,但我还需要一件事。我想要一种方法,可以将程序的完整输出打印到Python控制台(逐行打印也可以),而且我需要一种方法把控制台中的命令转发给这个程序。

2 个回答

1

你可以尝试在Python里面创建一个交互式的命令行,就像这样:

import sys
import os
import subprocess
from subprocess import Popen, PIPE
import threading


class LocalShell(object):
    def __init__(self):
        pass
    def run(self):
        env = os.environ.copy()
        p = Popen('open -a Terminal -n', stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT, shell=True, env=env)
        sys.stdout.write("Started Local Terminal...\r\n\r\n")

        def writeall(p):
            while True:
                # print("read data: ")
                data = p.stdout.read(1).decode("utf-8")
                if not data:
                    break
                sys.stdout.write(data)
                sys.stdout.flush()

        writer = threading.Thread(target=writeall, args=(p,))
        writer.start()

        try:
            while True:
                d = sys.stdin.read(1)
                if not d:
                    break
                self._write(p, d.encode())

        except EOFError:
            pass

    def _write(self, process, message):
        process.stdin.write(message)
        process.stdin.flush()
6

对于这种任务,最常用的解决方案是使用Pexpect

Pexpect是一个Python模块,可以用来启动子程序并自动控制它们。简单来说,Pexpect可以帮助你自动化一些需要交互的程序,比如ssh、ftp、修改密码、telnet等等。它还可以用来自动化设置脚本,这样你就可以在不同的服务器上重复安装软件包。Pexpect也可以用于自动化软件测试。它的设计灵感来源于Don Libes的Expect,但Pexpect是纯Python写的。其他类似Expect的Python模块通常需要用到TCL和Expect,或者需要编译C扩展。而Pexpect不需要用到C、Expect或TCL扩展。它应该可以在任何支持标准Python pty模块的平台上运行。Pexpect的界面设计注重易用性,所以简单的任务处理起来非常方便。

撰写回答