Ausgabe von Programm in einem Fenster öffnen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Hallo.

Und wieder muss ich euch um Hilfe bitte. :(

In meinem Skript führe ich mit

Code: Alles auswählen

os.system('rpmbuild -ba /pfad/zum/specfile') # früher rpm -ba
den Befehl rpmbuild aus um RPM Pakete für Linux zu erstellen.

Sobald dieser Befehl beendet ist soll ein Fenster geöffnet werden, in dem der Erfolg mitgeteilt wird.

Das funktioniert auch. Nur leider auch bei einem Misserfolg. Daher habe ich mir überlegt, die Ausgabe von rpmbuild in ein seperates Fenster umzuleiten.

Leider habe ich in meinem schlauen Buch wiedermal nichts darüber gefunden. Auch keinen Hinweis, wie ich den Exit-Status prüfen kann.

Könnte ihr mir bitte nochmal einen Tipp/Hinweis geben?

Marcus
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Hallo bmh1980
Im Modul os gibts die beiden Funktionen popen und spawnl.
Mit popen öffnest Du eine Pipe und kannst Die Ausgaben des geöffneten Programmes abfangen, aber keinen Rückgabewert.
Mit spawnl öffnest Du ein Programm in einem neuen Thread. Zusammen mit der ProzessID und os.waitpid kannst Du den Rückgabewert abfragen.
Beispiel:

Code: Alles auswählen

      
pid = os.spawnv( os.P_NOWAIT, prog, para )
exit = os.waitpid( pid, 0 )
ret = (exit[1] >> 8)
Ich hoffe das ist so richtig. Bin mir nicht zu 100% sicher. Anmerkungen willkommen :wink:
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Ich weiß nicht, ob es an meiner Grippe liegt, oder ob ich einfach zu blöd bin. :( Aber irgendwie verstehe ich das nicht.

Bekomme ich mit deinem Code den Rückgabewert? Bzw. meinst du mit Rückgabewert den Exitstatus?

Wenn obiges alles zutrifft, dann mach ich was falsch. Unter Python bekomme ich eine dreistellige Zahl. Gebe ich den gleichen Befehl in einem XTerm ein, bekomme ich einen bekannten Exitstatus, wie '1'.

Oder hätte ich vielleicht den Inhalt von ret nicht mit print ausgeben dürfen? Also das habe ich aber nur zum Testen über eine Python-Shell gemacht.

Marcus
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Code: Alles auswählen

pid = os.spawnv( os.P_NOWAIT, prog, para )
pid ist die ProzessID

Code: Alles auswählen

exit = os.waitpid( pid, 0 )
exit ist ein Tupel (ProzessID, Rückgabewert)
Rückgabewert ist eine 16bit Zahl, deren höherwertiges Byte den Rückgabewert enthält

Code: Alles auswählen

ret = (exit[1] >> 8)
ret ist der Rückgabewert des Programms, welches mit spawnv aufgerufen wurde.

Das sollte eigenlich funktionieren. Bei mir gibts jedenfalls damit keine Probleme. Benutze allerdings Windows. Aber ich nehme doch an, dass es unter Linux genauso funzt. Gute Besserung übrigens :wink:
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Also. Ich habe nochmal einen Testlauf gemacht. Wäre nett, wenn du mal schauen könntest, ob es bei dir genauso rauskommt.

Habe alles über IDLE, bzw. die Python-Shell eingegeben.

Code: Alles auswählen

>>> import os
>>> pid = os.spawnv(os.P_NOWAIT, 'ls', '/home/marcus')
>>> print pid
2881
>>> exit = os.waitpid(pid, 0)
>>> print exit
(2881, 32512)
>>> ret = (exit[1] >> 8)
>>> print ret
127
ls ist unter Linux das, was unter Windows dir/w wäre. /home/marcus ist das Verzeichnis, in dem alle persönlichen Einstellungen und Dateien gespeichert werden. Unter Windows wäre das C:\Dokumente und Einstellungen\marcus.

Bei

Code: Alles auswählen

exit = os.waitpid(pid, 0)
verstehe ich nicht so ganz, was die 0 sein soll, bzw. wie ich die 32512 (ist ja wohl der Rückgabewert) interpretieren soll. Unter Linux würde 0 heißen, dass der Prozess erfolgreich beendet wurde. 1 heißt, dass es einen Fehler gabe. Alle Anderen sind genauere Eingrenzungen des Fehlers (meistens!).

Was bedeutet bei

Code: Alles auswählen

ret = (exit[1] >> 8)
[1] und >> 8?

Wäre super, wenn du mir hier noch ein bissle auf die Sprüge helfen könntest.

Marcus
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Ich habe gerade nochmal einen Blick in die Hilfe geworfen. Mit der Erkenntnis, dass ich nicht mehr weiss, warum ich überhaupt P_NOWAIT und nicht sofort P_WAIT verwendet habe. Dann liefert spawn() direkt den Rückgabewert. Näheres in der Python-Doku.
"dir" ist unter Windows ein eher schlechtes Beispiel, da man Pfad und Filename des auszuführenden Programms angeben muss.
Ich hab mal ein Mini-Beispielprogramm in C geschrieben, das einfach nur die Anzahl der übergebenen Parameter zurückgibt:

Code: Alles auswählen

int main(int argc, char *argv[])
{ 
   return argc;
}
Wenn ich dieses nun mit spawn() aufrufe, kommen auch immer korrekte Werte zurück (bei der Übergabe keinen Argumentes erhälst Du als Rückgabewert trotzdem eine 1 -> der Programmname wird immer alls erstes Argument übergeben).

spawn() gibt es in verschiedenen Versionen. Schaus Dir einfach mal in der Hilfe an.

zur den anderen Fragen:
Da exit ein Tupel aus zwei Elementen ist, ist exit[1] einfach der Zugriff auf das zweite Element.
>> 8 bedeutet 8 Bits nach rechts zu schieben. Im vorliegenden Fall war exit[1] eine 16 Bit Zahl. Wir waren aber nur an den oberen 8 Bits interessiert. Um die auszulesen verschiebt man sie einfach um 8 Bits nach rechts.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Wenn du einfach nur den Exitstatus haben willst, geht es um Meilen einfacher, da os.system den nämlich zurückgibt. Ein einfaches

Code: Alles auswählen

exitstatus = os.system('rpmbuild -ba /pfad/zum/specfile') # früher rpm -ba
genügt also vollauf.

Milan
bmh1980
gelöscht
Beiträge: 60
Registriert: Montag 26. Januar 2004, 17:13
Kontaktdaten:

Super! Das gibt den richtigen Exitstatus zurück. Zumindest bei Erfolg. Aber mehr will ich ja nicht.

Danke.

Marcus
Antworten