Управление терминальным приложением с помощью Python - PullRequest
4 голосов
/ 19 апреля 2011

У меня есть серверная программа, которая запускается через консоль.(В частности, сервер Bukkit MineCraft) Я хотел бы иметь возможность контролировать эту программу и читать вывод.Графического интерфейса нет, поэтому он не должен быть слишком сложным, верно?

В любом случае, я никогда не управлял консолью в python и полностью застрял.Любые предложения?

PS Я использую Debian Linux, так что это должно немного упростить ситуацию.

Я получил довольно хороший ответ, но мне также нужна еще одна вещь.Я хочу, чтобы у меня был какой-то способ распечатать ПОЛНЫЙ вывод программы на консоль python (строка за строкой в ​​порядке), и мне нужен какой-то способ для перенаправления команд из консоли в программу.

Ответы [ 2 ]

5 голосов
/ 19 апреля 2011

Канонический ответ для такой задачи - использовать Pexpect .

Pexpect - это модуль Python для порождения дочерних приложений и автоматического управления ими.Pexpect может использоваться для автоматизации интерактивных приложений, таких как ssh, ftp, passwd, telnet и т. Д. Он может использоваться для автоматизации сценариев установки для дублирования установок программного пакета на разных серверах.Может использоваться для автоматического тестирования программного обеспечения.Pexpect в духе Ожидания Дона Либеса, но Pexpect - чистый Питон.Другие Expect-подобные модули для Python требуют TCL и Expect или требуют компиляции расширений C.Pexpect не использует расширения C, Expect или TCL.Он должен работать на любой платформе, которая поддерживает стандартный модуль Python pty.Интерфейс Pexpect ориентирован на простоту использования, поэтому простые задачи просты.

1 голос
/ 15 ноября 2018

Вы можете попробовать создать интерактивную оболочку внутри 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...