[solved]Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Alles rund um die Programmierung mit Qt
Antworten
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

[solved]Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von hakaishi »

Hallo Leute,

ich habe da ein Problem mit QProcess. Bisher ist es mir immer nur gelungen einen Befehl pro QProcess aufzurufen. Bei system() kann ich Befehle mit && verbinden, das geht bei QProcess anscheinend nicht. Das Problem bei system() ist aber, das es die Gui einfrieren lässt und man nicht abbrechen kann. Kurzes Beispiel wie ich das bei system() mache: system(some_string.toAscii()); In dem some_string könnte z.B. some_string = "qmake && make"; stehen.

Weiß vielleicht jemand, wie ich das bei QProcess machen kann, oder wie ich es schaffe, dass bei system() das Programm nicht einfriert und abbrechbar ist? - Ich würde ja einfach die QProcess Prozesse einfach nacheinander ausführen lassen... Die Befehle werden jedoch von einem User in ein line edit eingetippt. Ich kann schlecht unendlich viele line edits hinzufügen...

Gruß, Hakaishi
Zuletzt geändert von hakaishi am 1. Mai 2012 13:23, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von franzf »

Ist dir die spezielle Bedeutung des "&&" bei der Aneinanderreihung von Befehlen bekannt?

Code: Alles auswählen

kill && echo "Blubb"
wird niemals "Blubb" ausgeben, da kill nicht korrekt aufgerufen wurde (not enough arguments). Wenn du also daran dachtest, alles in einzelne LineEdits zu packen, wie soll dann der User solche Konstrukte basteln?
Die mMn. einzige Lösung (mit QProcess, welcher ja nur den ersten Befehl als solchen ausführt, der Rest wird als cmdLineArgs weiter gegeben) ist, das was der User in das LineEdit (vllt. besser gleich ein TextEdit?) packt in ein File zu speichern. Wenn der "Befehl" ausgeführt werden soll, machst du

Code: Alles auswählen

QString shell = QProcessEnvironment::systemEnvironment().value("SHELL");
// das ist dann die Shell, die der User verwendet (hier /bin/zsh), kannst aber natürlich auch /bin/sh (bzw. cmd.exe unter win) o.Ä. nehmen
QStringList args;
args << "-x" << userCommandsFile;
QProcess::startDetached(shell, args);
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von hakaishi »

Hallo franzf,

Die Bedeutung von "&&" war mir bewusst. :)

Ich habe es genaus so in mein Programm eingefügt, wie du geschrieben hast:

Code: Alles auswählen

QString shell = QProcessEnvironment::systemEnvironment().value("SHELL");
//bei mir wird /bin/bash verwendet
QStringList args;
args << "-x" << textEdit->toPlainText();
QProcess::startDetached(shell, args);
Es ist übrigens ein QTextEdit und kein QLineEdit ... da hab ich nicht aufgepasst^^"

Bei mir wird allerdings nichts ausgeführt. Im Terminal bekomme ich folgende Ausgabe: "/usr/bin/qmake: /usr/bin/qmake: Kann die Datei nicht ausführen."
Alles was ich eingegeben hatte war qmake. Und wenn ich z.B. ls /usr/bin aufrufen möchte (egal mit welchen Anführungszeichen oder auch ohne) bekomme ich immer "/bin/bash: ls /usr/bin: Datei oder Verzeichnis nicht gefunden" und derlei...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von franzf »

Code: Alles auswählen

$SHELL -x
erwartet dann eine Datei, die interpretiert werden kann. Du gibst jetzt direkt den Input im Textedit an den Interpreter (/bin/bash) weiter, was natürlich nur schief gehen kann (qmake ist ein Binary, nicht interpretierbar durch bash, deshalb die Meldung "Kann die Datei nicht ausführen.").
Ich dachte, das wäre eine Art Config-Dialog, da hätte so ein kleines gespeichertes Script durchaus Sinn gemacht. Wenn das "Live" sein soll, ist für dich statt "-x" die Option "-c" interessant. also

Code: Alles auswählen

args << "-c" << textEdit->toPlainText();
Klappt das dann wie gewünscht?
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von hakaishi »

Ja, mit der Option -c funktioniert es! :D
Gibt es eigentlich auch eine Möglichkeit, wie ich das bei früheren Qt Versionen umsetzen kann, wo es noch kein QProcessEnvironment gibt? Also mit QProcess::systemEnvironment()?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von franzf »

QProcess::systemEnvironment() gibt dir ne QStringList. Darin gibts dann nen Eintrag "SHELL=/bin/bash". Den musst du dir selber suchen.
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von hakaishi »

Soweit bin ich auch gekommen... Dann würde ich mit filter("SHELL") den Teil auch finden, aber dann habe ich immer noch eine QStringList... Wie komme ich dann wieder zu meinem QString?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von Christian81 »

Naja - ein wenig Eigeninitiative ist auch gefragt: Doku zu QStringList
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von franzf »

Schauen, wie lange die StringList ist (sollte 1 sein, wenn nicht - Oops?) das Element als String nehmen, und mit QString::lastIndexOf() + QString::mid() den relevanten Teil (also '/bin/bash' o.Ä.) rausschneiden.
Um das jetzt nicht immer machen zu müssen wenn du es brauchst, bietet sich eine eigene Funktion an.

Alternativ gibts natürlich auch noch qgetenv, was aber etwas unhandlicher ist als QProcessEnvironment. Gibts einen Grund, warum du Qt-Versionen <4.6 unterstützen willst?
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von hakaishi »

Ich hab's:
QString shell = QProcess::systemEnvironment().filter("SHELL").first().remove("SHELL=");

Vielen, vielen Dank! :D
hakaishi
Beiträge: 62
Registriert: 8. Dezember 2009 18:25

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen

Beitrag von hakaishi »

franzf hat geschrieben:Gibts einen Grund, warum du Qt-Versionen <4.6 unterstützen willst?
Ich möchte, dass mein Programm auch auf älteren Ubuntu Versionen etc. läuft. Daher ab Version 4.1. ^^
Antworten