使用Python控制终端应用程序

时间:2011-04-19 00:21:27

标签: python terminal

我有一个通过控制台运行的服务器程序。 (具体来说,Bukkit MineCraft服务器)我希望能够控制这个程序并读取输出。没有GUI,所以它不应该太难,对吧?

无论如何,我从来没有在python中控制过一个控制台而且完全卡住了。有什么建议吗?

P.S。我正在使用Debian Linux,因此应该简化一些事情。

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

2 个答案:

答案 0 :(得分:5)

此类任务的规范答案是使用Pexpect

  

Pexpect是一个用于生成子应用程序和控制的Python模块   他们自动。 Pexpect可用于自动化交互式应用程序   例如ssh,ftp,passwd,telnet等。它可以用于自动化设置   用于在不同服务器上复制软件包安装的脚本。它   可用于自动化软件测试。 Pexpect是唐的精神   Libes'期待,但Pexpect是纯Python。其他类似Expect的Python模块   要求TCL和Expect或要求编译C扩展。 Pexpect没有   使用C,Expect或TCL扩展。它应该适用于任何支持的平台   标准的Python pty模块。 Pexpect界面侧重于易用性   简单的任务很简单。

答案 1 :(得分:1)

您可以尝试在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()