Fehler von os.system() abfangen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie kann ich bei einem Aufruf aus einem Skript Fehler von os.system() abfangen?

Also z.B.

os.system('/pfad/nach/nirgendwo')

gibt eine Fehlermeldung (je nach OS mal so mal so), aber (logischerweise) keine Null = ok und das Skript bricht ab.

Gruß, noisefloor
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nutze subprocess! Gibt hier zig Beispiele im Forum dazu.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok, Danke. Funktioniert sogar. :)

Kann man mit subprocess auch externe Progs so starten, dass das Skript weiterläuft und nicht wartet, bis das externe Prog beeendet wird?

Gruß, noisefloor
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ist das nicht das ganz normale Verhalten von Popen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:Ist das nicht das ganz normale Verhalten von Popen?
Ja ist es. Für blokierende Aufrufe hat das ``Popen``-Objekt die Methode ``wait()``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich vermute, dass `subprocess.call()` genutzt wird, was ja bekanntlich die Argumente nur an `subprocess.Popen()` weitergibt und darauf ein `wait()` ausführt. Dies würde zum genannten Verhalten führen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

yup, so isses.

Was ich bräuchte ist eine Befehl, der nur "wartet", bis das Programm offen ist und keine Fehler kommt. Wann das externe Programm beendet wird ist egal.

Beispiel:

Folgende (zugegebener Maßen nicht sehr nützliche) Zeil im Skript hält es so lange an, bis gedit beendet wird:

subprocess.call(['gedit','irgnedwas.csv'])

Das Ende ist mir aber egal, es geht nur um den Start.

Gruß, noisefloor
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und was ist jetzt das Problem bei Popen()? Geht es darum, dass das Programm komplett initialisiert sein muss, also nicht mehr laden darf? Denn Fehler werden auch hier abgefangen: Gib mal spaßeshalber etwas falsches für Popen() mit.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

noisefloor hat geschrieben: Was ich bräuchte ist eine Befehl, der nur "wartet", bis das Programm offen ist und keine Fehler kommt. Wann das externe Programm beendet wird ist egal.
"Warten" heißt hier "blocken". Da gibt es aber ein Problem: Wenn dein Zielprogramm keinen Mechanismus dafür eingebaut hat, gibt es keinen portablen Weg, heraus zu finden, in welchem Zustand es sich gerade befindet. GEdit meldet z.B. nicht, wann es das Fenster auf gemacht und die Datei geladen hat. Warum sollte es das auch tun? Für das Aufrufende Programm gibt es nur 'läuft noch' und 'beendet mit Rückgabe Wert X'. Dazwischen gibt es nichts.

Wobei, das stimmt nicht ganz: Dazwischen findet Kommunikation z.B. über stdin und stdout des Unterprozesses statt. Wenn GEdit in die Konsole schreibt 'Datei fertig geladen...' dann kannst du das auch abfangen.

Du könntest den WindowManager auch nach offenen Fenstern und deren Inhalt fragen, aber da wird die Sache echt unschön.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@noisefloor:

Wäre interessant zu wissen, wofür du das brauchst. Vielleicht gibt es auch einen anderen Weg, um dein eigentliches Problem zu lösen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok,

Code: Alles auswählen

subprocess.Popen('gedit')
hat genau das Verhalten, was ich brauche. Startet das Prog läuft das Skript weiter, wenn das Prog nicht startet gibt's eine Excpetion, die man abfangen kann.

Thx @ snafu :-)

Muss es jetzt noch unter Windows testen, gehe aber davon aus, dass es da auch geht... ;-)

Gruß, noisefloor[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Besser:

Code: Alles auswählen

subprocess.Popen(['gedit'])
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

noisefloor hat geschrieben:Muss es jetzt noch unter Windows testen, gehe aber davon aus, dass es da auch geht... ;-)
Ja, `subprocess` ist für beide Systeme ausgelegt. Solange man die richtigen Argumente - sprich: den richtigen Startbefehl - übergibt, sollte es eigentlich keine Probleme geben.
Antworten