用Python控制终端应用程序

用Python控制终端应用程序,python,terminal,Python,Terminal,我有一个通过控制台运行的服务器程序。(特别是Bukkit MineCraft服务器)我希望能够控制这个程序并读取输出。没有GUI,所以应该不会太难吧 无论如何,我从来没有用python控制过控制台,我完全被卡住了。有什么建议吗 另外,我使用的是DebianLinux,所以这应该会简化一些事情 我得到了一个很好的答案,但我还需要一件事。我想有一些方法将程序的完整输出打印到python控制台(逐行打印很好),并且我需要一些方法将控制台中的命令转发到程序。像这样的任务的标准答案是使用 Pexpect是

我有一个通过控制台运行的服务器程序。(特别是Bukkit MineCraft服务器)我希望能够控制这个程序并读取输出。没有GUI,所以应该不会太难吧

无论如何,我从来没有用python控制过控制台,我完全被卡住了。有什么建议吗

另外,我使用的是DebianLinux,所以这应该会简化一些事情


我得到了一个很好的答案,但我还需要一件事。我想有一些方法将程序的完整输出打印到python控制台(逐行打印很好),并且我需要一些方法将控制台中的命令转发到程序。

像这样的任务的标准答案是使用

Pexpect是一个Python模块,用于生成子应用程序和控制 它们会自动生成。Pexpect可用于自动化交互式应用程序 例如ssh、ftp、passwd、telnet等。它可以用于自动化设置 用于在不同服务器上复制软件包安装的脚本。信息技术 可以用于自动化软件测试。Pexpect符合Don的精神 Libes的Expect,但Pexpect是纯Python。其他类似Python的模块 需要TCL和Expect,或者需要编译C扩展。Pexpect没有 使用C、Expect或TCL扩展。它应该可以在任何支持 标准Python pty模块。Pexpect接口注重易用性,因此 简单的任务是容易的


您可以尝试在python中创建一个交互式shell,例如:

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

可能重复我不确定上面的链接问题是否重复,因为该问题不涉及交互式程序。我假设这个服务器程序在某种程度上是交互式的,这似乎是一个好方法。我真的不需要那么多的输出,而这对于输入来说似乎是完美的。我的一个问题是如何知道程序何时停止运行?@ZonedBone:根据,当这些事件发生时,
expect()
函数会引发
EOF
TIMEOUT
异常。