ubuntuusers.de

Python und externe Programme aufrufen (asynchron)

Status: Gelöst | Ubuntu-Version: Kubuntu 6.06 (Dapper Drake)
Antworten |

oliver1974

Avatar von oliver1974

Anmeldungsdatum:
2. Juli 2006

Beiträge: 266

Hallo,

Ich experimentiere gerade mit Python rum....

Dass ich mit os.system(...) ein Programm aufrufen kann, ist mir hinlänglich bekannt,
aber das ist ja "synchron", d.h. der Rest des Python-Skriptes wartet darauf, dass
das aufgerufene Programm beendet wird...

Ich finde jetzt trotz Suchen nicht, wie man Programme "asynchron" aufrufen kann,
also dass das Python Skript nicht auf einen Rückgabewert oder dergleichen wartet.

Was gibt es denn da so schönes?

Gruß,

Olli

SirSiggi

Avatar von SirSiggi

Anmeldungsdatum:
12. September 2005

Beiträge: 823

Ich nix Python, aber prinzipiell wär das ein klassicher Fall für Threads oder Forken. Letzteres sollte auf jedenfall möglich sein und Threads wird Python ja wohl auch unterstützen.

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

os.popen blockiert nicht sondern kehrt gleich zurück.

Wobei ich mir gleich eine Wrapper-Klasse schreiben würde, die ich von threading.Thread ableiten würde. Die Klasse würde regelmäßig das stdout von dem Prozess pollt und mir dann ein event an einen (registrierbaren) Eventhandler feuert.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4673

Wohnort: Berlin

Oder man könnte auch einen Blick in das Modul subprocess werfen, das genau für solche Anwendungsfälle existiert.

oliver1974

(Themenstarter)
Avatar von oliver1974

Anmeldungsdatum:
2. Juli 2006

Beiträge: 266

Blattlaus hat geschrieben:

os.popen blockiert nicht sondern kehrt gleich zurück.

DAS überrascht mich jetzt, denn zumindest auf einer Windows-Kiste hier blockiert
os.popen definitv (Python 2.4).

oliver1974

(Themenstarter)
Avatar von oliver1974

Anmeldungsdatum:
2. Juli 2006

Beiträge: 266

Update:

Tja, os.popen wartet bei mir hier, bis der aufgerufene Prozess beendet ist..
Aber subprocess.Popen(...) funktioniert wie gewünscht.

Danke soweit!

Chaoswind

Anmeldungsdatum:
10. August 2005

Beiträge: 544

os.popen blockiert nicht. Erst der aufruf der read-Methode blockiert.

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

Und das ist ja auch völlig richtig. Wenn man etwas lesen wil uns nicht vorhanden ist, wird eben gewartet, bis etwas kommt.
Oder möchtest du lieber ne Exception haben? 😀

Chaoswind

Anmeldungsdatum:
10. August 2005

Beiträge: 544

Wer einen Systembefehl absetzt, ohne das sien Skript davon unterbrochen wird, will keinen rückgabewert, oder sich mit Ereignissorientiertem Design beschäftigen.

Antworten |