|
Prozesse mit popen() starten
Frage: Kennt jemand einen Weg, einen Prozess aus einer Anwendung heraus zu starten, ohne die laufende Anwendung zu beenden?
Antwort: Ja, diese Möglichkeit gibt es - und zwar mit Hilfe der C-Funktion popen(). Der Prototyp befindet sich in der Headerdatei stdio.h:
FILE *popen(const char *command, const char *type);
Die Funktion startet einen Prozeß und öffnet eine Pipe (eine Pipe ist unidirektional, d.h. das Argument type darf nur 'Lesen' oder 'Schreiben' festlegen). Das Argument command ist ein Pointer auf einen String (NULL terminiert), der einen Shell-Befehl enthält.
Der Rückgabewert von popen() ist in C ein herkömmlicher Standard-IO Kanal. Dieser muß mit pclose(), nicht etwa mit fclose(), geschlossen werden.
Das Schreiben in den Datenkanal bewirkt praktisch das Schreiben in die Standardeingabe eines Kommandos, während die Standardausgabe eines Kommandos gleichzeitig die Ausgabe des aufgerufenen Prozesses ist. Falls Sie mehr wissen möchten: der Aufruf man popen liefert ausführliche Informationen.
Im os-Modul der Sprache Python findet sich die popen()-Funktion ebenfalls. Der Umgang ist im Vergleich zur C-Funktion aber einfacher. Hier das Aufruf-Schema:
popen(command [, mode='r' [, bufsize]]) -> pipe
Auch hier wird, wie bei C, eine Pipe geöffnet und ein File-Object zurückgeliefert. Im Prinzip ist die Python-Funktion nur ein Wrapper um die zugrundeliegende C-Funktion. Die Arbeit mit File-Objekten ist in Python sehr effektiv - d.h. Sie können jede Methode nutzen, die Sie bei der Arbeit mit normalen Dateien verwenden. Ein einfaches Beispiel demonstriert den Umgang mit os.popen():
#!/usr/bin/env python
import os
if __name__ == '__main__':
com = 'ls -laHt' FP = os.popen(com) for line in FP: if '~' in line: continue else: print line,
Das Beispiel listet alle Dateien des aktuellen Verzeichnisses auf; backup files werden dabei nicht berücksichtigt, dafür sorgt folgende Zeile:
if '~' in line: continue
Tipp: Falls Sie ad-hoc Hilfe für ein Python-Konstrukt benötigen, können Sie das so bewerkstelligen:
pydoc os.popen
Viel Spass.
Thomas Kaufmann
|