[solved]Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
[solved]Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
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
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.
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Ist dir die spezielle Bedeutung des "&&" bei der Aneinanderreihung von Befehlen bekannt?
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
kill && echo "Blubb"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);Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Hallo franzf,
Die Bedeutung von "&&" war mir bewusst.
Ich habe es genaus so in mein Programm eingefügt, wie du geschrieben hast:
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...
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);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...
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Code: Alles auswählen
$SHELL -xIch 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();Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Ja, mit der Option -c funktioniert es!
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()?
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()?
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
QProcess::systemEnvironment() gibt dir ne QStringList. Darin gibts dann nen Eintrag "SHELL=/bin/bash". Den musst du dir selber suchen.
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
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
Naja - ein wenig Eigeninitiative ist auch gefragt: Doku zu QStringList
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
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?
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?
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Ich hab's:
QString shell = QProcess::systemEnvironment().filter("SHELL").first().remove("SHELL=");
Vielen, vielen Dank!
QString shell = QProcess::systemEnvironment().filter("SHELL").first().remove("SHELL=");
Vielen, vielen Dank!
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Ich möchte, dass mein Programm auch auf älteren Ubuntu Versionen etc. läuft. Daher ab Version 4.1. ^^franzf hat geschrieben:Gibts einen Grund, warum du Qt-Versionen <4.6 unterstützen willst?