[英]Python Logger : StreamHandler not controlling my terminal stdout?
[英]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.