Stdout eines Prozesses an ein Textedit koppeln

Alles rund um die Programmierung mit Qt
Antworten
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Stdout eines Prozesses an ein Textedit koppeln

Beitrag 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();
}
marvel
Beiträge: 105
Registriert: 9. August 2009 07:41

Re: Stdout eines Prozesses an ein Textedit koppeln

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Stdout eines Prozesses an ein Textedit koppeln

Beitrag 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).
Antworten