簡體   English   中英

使用Python控制終端應用程序

[英]Controlling a terminal application with Python

我有一個通過控制台運行的服務器程序。 (具體來說,Bukkit MineCraft服務器)我希望能夠控制這個程序並讀取輸出。 沒有GUI,所以它不應該太難,對吧?

無論如何,我從來沒有在python中控制一個控制台而且完全卡住了。 有什么建議?

PS我正在使用Debian Linux,因此應該簡化一些事情。

我得到了一個很好的答案,但我還需要一件事。 我想有一些方法將程序的FULL輸出打印到python控制台(逐行排序很好),我需要一些方法將控制台中的命令轉發到程序。

像這樣的任務的規范答案是使用Pexpect

Pexpect是一個Python模塊,用於生成子應用程序並自動控制它們。 Pexpect可用於自動化交互式應用程序,如ssh,ftp,passwd,telnet等。它可用於自動化設置腳本,以便在不同服務器上復制軟件包安裝。 它可用於自動化軟件測試。 Pexpect本着Don Libes的期望,但Pexpect是純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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM