使用PyQt4 gui在Python中使用真正的交互式操作系统shell

时间:2014-09-09 14:30:37

标签: python shell pyqt4 qtextedit

我正在寻找一个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

0 个答案:

没有答案