用Python控制终端应用程序

| 我有一个通过控制台运行的服务器程序。 (特别是Bukkit MineCraft服务器)我希望能够控制该程序并读取输出。没有GUI,所以它应该不会太难,对吧? 无论如何,我从未在python中控制过控制台,而完全陷入了困境。有什么建议么? 附言我正在使用Debian Linux,因此应该可以简化一些事情。 我已经得到了一个很好的答案,但是我还需要一件事。我想有一些方法可以将程序的FULL输出打印到python控制台(逐行显示),并且需要某种方式将控制台中的命令转发到程序。
已邀请:
此类任务的规范答案是使用Pexpect。 Pexpect是一个Python模块,用于生成子应用程序并进行控制 他们自动。 Pexpect可用于自动化交互式应用程序 例如ssh,ftp,passwd,telnet等。它可用于自动设置 用于在不同服务器上复制软件包安装的脚本。它 可用于自动化软件测试。 Pexpect秉承Don的精神 Libes的期望,但Pexpect是纯Python。 Python的其他类似Expect的模块 需要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()

要回复问题请先登录注册