如何解决用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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。