Problem beim Auslesen der Konsolenausgabe. (Qt)



  • ICh will die Ausgabe des Programmes "cat /proc/partitions" auf der Konsole auslesen!
    Das hatte ich mit dieser Funktion vor:

    QStringList getPrcOutP(QString cmd)
    {
       QProcess *process = new QProcess();
       std::cout<<"try to open: "<<cmd.toStdString()<<std::endl;
       process->start(cmd, QIODevice::ReadOnly);
    
       if (!process->waitForStarted() )
          std::cout<<"process couldn't get opened"<<std::endl;
    
       QTextStream *txt_stream = new QTextStream(process);
    
       QStringList output;
       while(!txt_stream->atEnd() )
       {
          std::cout<<"read output: ";
          QString tmp_str = txt_stream->readLine();
          output.append(tmp_str);
          std::cout<<tmp_str.toStdString()<<std::endl;
       }
    
       if(process->waitForFinished() )
       {
          process->close();
          std::cout<<"process finished: "<<std::endl;
          return output;
       }
    }
    

    bekomme als Ausgabe aber nur das

    try to open: cat
    process finished:
    

    Ich weiß wirklich nicht was ich falsch mache. Könnte mir da einer weiterhelfen?



  • bis du sicher, dass cmd="cat /proc/partitions" ist und nciht cmd="cat" ist?

    mfg aman..



  • nich wenn man linux verwendet?!



  • nichts für ungut, aber egal was ich fürn befehl eingebe, es klappt alles nicht.. bei qt 3 war alles noch ok, aber bei 4 scheints nicht zu klappen. irgendwie muss es doch gehen eine ausgabe auszulesen, ich verzweifle langsam!



  • was passiert wenn du waitForStarted(-1) und oder waitForFinished(-1) machst?

    probier vielleicht mal das readonly wegzulassen.

    probier mal den direkten pfad zu cat anzugeben (zB /bin/cat bei mir)..

    probier mal den befehl direkt auf der konsole auszufuehren..

    mfg aman..



  • also, die ausgabe von fdisk, wass ich auchmal probiert habe ist so:

    Aufruf: fdisk [-l] [-b SSZ] [-u] Gerät
    Zum Beispiel: fdisk /dev/hda       (die erste IDE-Festplatte)
            oder: fdisk /dev/sdc       (die dritte SCSI-Festplatte)
            oder: fdisk /dev/eda       (die erste PS/2 ESDI-Festplatte)
            oder: fdisk /dev/rd/c0d0
            oder: fdisk /dev/ida/c0d0  (RAID-Festplatten)
            ...
    

    die Funktion schweigt leider immernoch, nichts hilft... ich habe mir schon gedacht, dass es vielleicht an der Qt-Versuion liegt?! Aber dass ist es zu 99% nicht.
    ihr könnt ja selber mal die Funktion ausprobieren, vielleicht spuckt sie bei euch was aus...



  • hab den fehler gefunden, du musst erst waitForFinished() ausfuehren, bevor du von der iodevice liest..

    hier ein schlamppiger code, der funzt..
    (du solltest ihn noch "verschoenern")

    QStringList getPrcOutP2(QString cmd) 
    { 
    	QProcess *process = new QProcess(); 
    	std::cout<<"try to open: "<<cmd.toStdString()<<std::endl; 
    	process->start(cmd, QIODevice::ReadOnly); 
    
    	if (!process->waitForStarted() ) 
    		std::cout<<"process couldn't get opened"<<std::endl; 
    
    	QStringList output; 
    	process->waitForFinished();
    
    	QTextStream *txt_stream = new QTextStream(process); 
    
    	while(!txt_stream->atEnd() ) 
    	{ 
    		std::cout<<"read output: "; 
    		QString tmp_str = txt_stream->readLine(); 
    		output.append(tmp_str); 
    		std::cout<<tmp_str.toStdString()<<std::endl; 
    	} 
    
    	std::cout<<"process finished: "<<std::endl; 
    	return output; 
    }
    

    mfg aman..



  • eigenartig, ich habe mir vorgestellt, dass die prozessausgabe ausgelesen wird, wenn wenn der prozess noch läuft?! jetzt weiß ich, dass ich auf das ende warten muss bevor es an die ausgabe geht. danke. 👍


Anmelden zum Antworten