Seite 1 von 1

Fehler von os.system() abfangen

Verfasst: Mittwoch 24. Juni 2009, 19:44
von noisefloor
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

Verfasst: Mittwoch 24. Juni 2009, 20:13
von Hyperion
Nutze subprocess! Gibt hier zig Beispiele im Forum dazu.

Verfasst: Mittwoch 24. Juni 2009, 20:36
von noisefloor
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

Verfasst: Mittwoch 24. Juni 2009, 20:45
von Hyperion
Ist das nicht das ganz normale Verhalten von Popen?

Verfasst: Donnerstag 25. Juni 2009, 08:21
von Leonidas
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()``.

Verfasst: Donnerstag 25. Juni 2009, 10:52
von snafu
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.

Verfasst: Samstag 27. Juni 2009, 19:16
von noisefloor
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

Verfasst: Sonntag 28. Juni 2009, 06:13
von snafu
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.

Verfasst: Sonntag 28. Juni 2009, 09:41
von Defnull
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.

Verfasst: Sonntag 28. Juni 2009, 09:57
von snafu
@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.

Verfasst: Sonntag 28. Juni 2009, 19:42
von noisefloor
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]

Verfasst: Sonntag 28. Juni 2009, 19:45
von Leonidas
Besser:

Code: Alles auswählen

subprocess.Popen(['gedit'])

Verfasst: Sonntag 28. Juni 2009, 19:56
von snafu
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.