Seite 1 von 1

Stdout eines Prozesses an ein Textedit koppeln

Verfasst: 11. Juni 2012 10:55
von marvel
Hallo liebe Community,

ich habe ein Pythonskript implementiert das während der Laufzeit auf der Konsole Text ausgibt. Nun habe ich eine GUI in Qt auf der durch Klicken des "StartTest"-Buttons das Pythonskript via QProcess gestartet wird. Das funktioniert auch soweit alles gut. Ich möchte jedoch die einzelnen Ausgaben des Skripts während der Laufzeit abfangen können und nicht erst am Ende des Prozesses die gesamte Ausgabe erhalten. Gibt es eine Möglichkeit während der Prozess läuft und im Pythonskript ein print ausgeführt wird, diese Ausgabe direkt abzufangen oder muss ich immer warten bis der Prozess abgearbeitet wurde und kann dann einmal auf die gesamte Ausgabe zugreifen ? Ich hoffe ich konnte das Problem erklären.

Code: Alles auswählen

Controller::Controller(QObject *parent) : QObject(parent)
{
        m_ptGUI = new GUI();
	m_ptProcess = new QProcess();

	// Testroutine 
	QObject::connect(m_ptGUI->getPushButtonStartTest(),SIGNAL(clicked()),this,SLOT(startTest()));

	// Prozess
	connect (m_ptProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(getProcessOutput()));
	connect (m_ptProcess, SIGNAL(readyReadStandardError()), this, SLOT(getProcessError()));
}

void Controller::startTest()
{	
	m_ptProcess->setWorkingDirectory("P:\\Test\\Scripts\\");
	m_ptProcess->start("python",QStringList() << "formTest.py" << "-ap" << "P:\\Test\\Application-vc80-ugd.dll" << "-lf" << "FormLogic.dll" << "-rfp" << "P:\\Test\\ReferenceFiles\\*.*");
}

void Controller::getProcessOutput()
{
	qDebug() << "printOutput";
	QByteArray a = m_ptProcess->readAllStandardOutput();
	qDebug() << a;
	m_ptGUI->getTextEditProtocol()->setText(a);
}


void Controller::getProcessError()
{
	qDebug() << "ERROR";
	qDebug() << m_ptProcess->readAllStandardError();
}

Re: Stdout eines Prozesses an ein Textedit koppeln

Verfasst: 11. Juni 2012 11:05
von marvel
Hey,

habe es gerade gelöst, sry wegem dem Post, aber vllt hilft es jmd anderem weiter !

Lösung des Problems war es innerhalb des Pythonskripts nach jeder Ausgabe bzw. ein Schreiben ins Stdout die flush()-Funktion aufzurufen

Re: Stdout eines Prozesses an ein Textedit koppeln

Verfasst: 11. Juni 2012 11:15
von franzf
Wollte das mit dem flushen auch gerade schreiben ;)
->
import sys
sys.stdout.flush()

Ein flushen nach jeder Ausgabe ist aber ganz schön unperformant. Besser wäre es, das flushen Blockweise zu machen, also nur nach einer längeren zusammengehörenden Kette an prints, oder per timer triggern, usw. flush ist nämlich teuer und kann die Ausführung des Scripts ordentlich verzögern (wenn du viele Ausgaben hast).