我正在寻找一个python模块,它通过STDIO提供一个TRUE交互式操作系统shell(在Linux,win和Mac OS中)。我尝试了使用subprocess + PIPES和/或QProcess启动csh / bash或cmd.exe然后通过QTextEdit keyPressEvents提供原始终端IO的各种示例。这适用于基本的os命令但如果我想在shell进程中启动另一个应用程序(例如telnet,ssh,tcl,python,netstat等等),stdin和stdout不再附加,可能是由于正在创建新的子进程。我是否必须对每个命令进行子处理/ QP处理并跟踪所有子进程? - 这将是丑陋的,必须有一个更好的方式...... (我也看过pexpect / wexpect,但无法让它可靠地工作。)
环境:Win7,RHEL6.4,Python 2.7.8,Qt 4.8.6
似乎所请求的模块将成为标准PyQt库的一部分;我错过了什么吗? 也许在python中没有太多需要真正的交互式操作系统。
原壳终端的示例片段:
class Console(QtGui.QTextEdit):
def __init__(self, startup_message='', parent=None):
super(Console, self).__init__(parent)
. . .
# TextEdit settings
self.setAcceptRichText(True)
#QProcess setup
self.proc = QtCore.QProcess()
self.proc.setProcessChannelMode(QtCore.QProcess.MergedChannels)
self.proc.setReadChannelMode(QtCore.QProcess.MergedChannels)
QtCore.QObject.connect(self.proc, QtCore.SIGNAL("readyReadStandardOutput()"), self.procReadStdOutput)
. . .
if sys.platform == "win32":
self.proc.start(r"cmd.exe", mode=QtCore.QProcess.ReadWrite)
elif sys.platform == "linux2":
self.proc.start(r"csh", mode=QtCore.QProcess.ReadWrite)
. . .
def runCommand(self):
if self.userTextEntry != "":
self.userCommand = self.userTextEntry
self.userTextEntry = ""
try:
self.proc.writeData(self.userCommand)
except Exception as error:
self.append(str(error))
else:
self.append(self.prompt)
return
. . .
def keyPressEvent(self, event):
if event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
event.accept()
self.userTextEntry += "\n"
self.runCommand()
. . .
@QtCore.pyqtSlot()
def procReadStdOutput(self):
self.append(QtCore.QString(self.proc.readAllStandardOutput()))
self.append(self.getOSPrompt())
self.proc.emit(QtCore.SIGNAL("cmdDone()"))
return