QProcess: stdout und stderr verbinden... [solved]

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

Hi, ich mal wieder :mrgreen:

Ich hab ein kleines Problem mit QProcess und zwar würde ich gerne den Output von z.B. "mkfs.ext3 -c /dev/sda1" in nem QTextEdit Widget anzeigen lassen, was auch funktioniert nur eben nicht korrekt!

Zwar wird ein Teil der Ausgabe im Widget angezeigt aber nur stdout und da mkfs.ext3 in stdout und stderr schreibt sieht man die hälfte nicht... z.B. die Prozentanzeige beim Badblocks check.

Obwohl ich self.process.ProcessChannelMode(QtCore.QProcess.MergedChannels) gesetzt habe seh ich stdout und stderror getrennt?

Muss ich stdout und stderr echt von Hand auslesen und mixen? oO

Dies hier seh ich im QTextEdit Widget (stdout):

Code: Alles auswählen

Stride=0 blocks, Stripe width=0 blocks
640848 Inodes, 2560000 Blöcke
128000 Blöcke (5.00%) reserviert für den Superuser
Erster Datenblock=0
Maximale Dateisystem-Blöcke=2621440000
79 Blockgruppen
32768 Blöcke pro Gruppe, 32768 Fragmente pro Gruppe
8112 Inodes pro Gruppe
Superblock-Sicherungskopien gespeichert in den Blöcken: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Dies hier seh ich überhaupt nicht da stderr:

Code: Alles auswählen

[PyQt4.QtCore.QByteArray(' 18.98% done, 0:29 elapsed\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08')]
[PyQt4.QtCore.QByteArray(' 19.64% done, 0:30 elapsed\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08')]
[PyQt4.QtCore.QByteArray(' 20.29% done, 0:31 elapsed\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08')]
[PyQt4.QtCore.QByteArray(' 20.89% done, 0:32 elapsed\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08')]
[PyQt4.QtCore.QByteArray(' 21.53% done, 0:33 elapsed\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08')]

Code: Alles auswählen

from PyQt4 import QtGui, QtCore, Qt
import sys

class console(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        
        self.setWindowTitle('Console Output')

        self.process = QtCore.QProcess()
        self.process.ProcessChannelMode(QtCore.QProcess.MergedChannels)
        self.process.start('bash',  QtCore.QStringList('-i'))
        
        self.view = QtGui.QTextEdit(self)
        self.view.setReadOnly(True)
        self.cmd = QtGui.QLineEdit(self)
        
        layout = QtGui.QGridLayout(self)
        layout.addWidget(self.view, 0,0,1,1)
        layout.addWidget(self.cmd, 1,0,1,1)
        
        self.connect(self.cmd, QtCore.SIGNAL('returnPressed()'), self.execute)
        self.connect(self.process, QtCore.SIGNAL('readyReadStandardOutput()'), self.output)
        self.connect(self.process,  QtCore.SIGNAL('readyReadStandardError()'),  self.error)

    def execute(self):
        self.process.write(str(self.cmd.text())+'\n')        
        self.cmd.setText('')

    def output(self):
        self.view.clear()
        bytes  = self.process.readAllStandardOutput()
        byte_list = bytes.split('\n')
        for i in range(len(byte_list)):
            self.view.append(QtCore.QString(byte_list[i]))
        
    def error(self):
        bytes = self.process.readAllStandardError()
        byte_list = bytes.split('\n')
        print byte_list

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv) 
    cons= console() 
    cons.show() 
    sys.exit(app.exec_())
Zuletzt geändert von AngelusNoctis am Sonntag 5. September 2010, 19:49, insgesamt 1-mal geändert.
lunar

Es muss ".setProcessChannelMode(QtCore.QProcess.MergedChannels)" lauten.
AngelusNoctis
User
Beiträge: 92
Registriert: Sonntag 16. Dezember 2007, 20:03

lunar hat geschrieben:Es muss ".setProcessChannelMode(QtCore.QProcess.MergedChannels)" lauten.
Oh, das jetzt aber peinlich :oops:

Thx :mrgreen:


PS. Seltsam das kein Fehler ausgelöst wurde ^^
Antworten