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
Fehler von os.system() abfangen
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
- 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
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
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ja ist es. Für blokierende Aufrufe hat das ``Popen``-Objekt die Methode ``wait()``.Hyperion hat geschrieben:Ist das nicht das ganz normale Verhalten von Popen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
- 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
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
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.
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
"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.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.
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.
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
ok,
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]
ok,
Code: Alles auswählen
subprocess.Popen('gedit')
Thx @ snafu
Muss es jetzt noch unter Windows testen, gehe aber davon aus, dass es da auch geht...
Gruß, noisefloor[/code]
-
- 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
Ja, `subprocess` ist für beide Systeme ausgelegt. Solange man die richtigen Argumente - sprich: den richtigen Startbefehl - übergibt, sollte es eigentlich keine Probleme geben.noisefloor hat geschrieben:Muss es jetzt noch unter Windows testen, gehe aber davon aus, dass es da auch geht...