Seite 1 von 1
[solved]Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 30. April 2012 23:27
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
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 08:05
von franzf
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
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
Verfasst: 1. Mai 2012 10:01
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...
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 10:58
von franzf
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
Klappt das dann wie gewünscht?
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 11:18
von hakaishi
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()?
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 12:06
von franzf
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
Verfasst: 1. Mai 2012 12:13
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?
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 12:20
von Christian81
Naja - ein wenig Eigeninitiative ist auch gefragt:
Doku zu QStringList
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 12:21
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?
Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 12:22
von hakaishi
Ich hab's:
QString shell = QProcess::systemEnvironment().filter("SHELL").first().remove("SHELL=");
Vielen, vielen Dank!

Re: Mehrere Prozesse/Befehle mit QProcess o.ä. ausführen
Verfasst: 1. Mai 2012 12:25
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. ^^