Python für Systemadministratoren Grundkurs

subprocess – Prozessbehandlung

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die subprocess-Bibliothek dient der Bearbeitung bzw. Behandlung von Prozessen auf Ihrem System. In dieser Bibliothek finden Sie nun auch die früher über unterschiedliche Bibliotheken verteilten Konstanten, Methoden und Funktionen in einem einheitlichen Namespace zusammengefasst. Damit lassen sich Prozesse einfach steuern.
07:04

Transkript

In dieser Lektion möchte ich Ihnen das Subprocess-Modul genauer vorstellen. Das Subprocess-Modul erlaubt Ihnen, einfach mit Prozessen umzugehen, das heißt, Prozesse zu starten und mit diesen zu kommunizeren. Das Subprocess-Modul dient auch als Vereinheitlichung. Prozesshandling in Python war über viele Module verteilt, und jetzt kommt alles im Subprocess-Modul zusammen. Was kann das Subprocess-Modul? Es hat wichtige Konstanten, Methoden und Funktionen. Erst mal "subprocess.PIPE". Damit können Sie eine PIPE oder auch einen Kanal zwischen allen Ausgabekanälen aufmachen. Durch "subprocess.Popen" können Sie ein Subprozess-Objekt instanziieren, und es an den Namen "proc" - in diesem Fall - binden. "proc.pid" gibt Ihnen die Prozess ID Ihres subprocesses oder Subprozesses zurück. "proc.returncode" gibt Ihnen den Rückgabewert zurück, den Rückgabewert des Subprozesses. "proc.communicate" erlaubt Ihnen, mit dem Subprozess zu kommunizieren. Das heißt, sich mit den einzelnen Ausgabekanälen, des Subprozesses zu verbinden. "proc.kill", damit können Sie einen Subprozess killen, töten. Durch "proc.poll" fragen Sie ab, ob der Subprozess noch läuft. Wollen Sie ein Signal an den Subprozess senden, können Sie "proc.send_signal" verwenden. Mit "proc.terminate" können Sie einen Subprozess direkt terminieren, also beenden. "proc.wait" wartet solange, bis der Subprozess vorbei ist, oft brauchen Sie aber kein explizites Subprozess-Objekt, sondern Sie können die zwei Hilfsfunktionen ".call" oder ".check_call" verwenden. Mit ".call" können Sie direkt einen Subprozess starten. Mit ".check_call" auch. Der Unterschied ist, dass ".call" im Fehlerfall eine 1 zurückgibt, ".check_call" wirft Ihnen eine Ausnahme. Nur werde ich alles in der Anwendung zeigen. Und los geht's. Erst mal den Python Interpreter aufrufen. Dann Subprozess importieren. Und dann fange ich mit den einfachen Hilfsfunktionen an. Erst mal ".call". Jetzt rufe ich "ls", "- l" auf. Und Sie sehen, die Ausgabe gleich auf Standard Out. Beziehungsweise hier in der Interpreter Shell. Das Argument ist in der Liste. Hier geht die Liste los, hier endet sie. Mit Argumenten "ls", "- l" als Strings. Und Sie sehen, da steht die Ausgabe. Wenn ich das jetzt im Gegensatz zum "check_call" mache, sehen Sie keinen Unterschied, da ja der Befehl erfolgreich ausgeführt wurde oder der Subprozess erfolgreich ausgeführt wurde. Sie sehen aber, was passiert, wenn ich hier, "ls" falsch aufrufe. "ls", "x" wäre das; diesen Befehl gibt es nicht. Jetzt kriege ich halt in diesem Fall eine so genannte "CalledProcessError"-Exception. Ok. Dann komme ich schon zum ".Popen"-Objekt. Hier habe ich ein Popen-Objekt instanziiert, in dem wird dem Namen "proc" zugewiesen, und das Entscheidende ist die Zeile hier. "stdout=subprocess.PIPE". Jetzt mache ich eine PIPE zu Standard Out auf, das heißt, das, was Date an Standard Out schreibt, bekomme ich, wenn ich "proc.communicate" aufrufe. So, jetzt sehen Sie meine aktuelle Uhrzeit. Das ist Standard Out. Hier wird das Standard Error dann landen, da ich aber Standard Error nicht mit der PIPE verbunden hab', bekomme ich hier nichts oder anders ausgedrückt "None". Was kriege ich noch weiter raus, über meinen Subprozess? proc. Seine Prozess ID. Dann kann ich fragen, "lebst du noch?". "Nein". Und ich kann terminieren, was in diesem Fall natürlich keinen Sinn macht, da der Subprozess ja so oder so nicht mehr läuft. Ich kriege also eine Fehlermeldung. Ok. Jetzt möchte ich den Befehl "date" nochmals aufrufen. Diesmal verbinde ich mich aber auch noch mit Standard Error. Und wenn ich jetzt "proc.communicate" aufrufe, sehen Sie, - ich mach es mal ein bisschen größer hier - steht hier nicht "None", sondern ein leerer String. Das heißt, "date" hat einen leeren String geliefert, als Standard Error. Es gab ja kein Fehler, also ist es ein leerer String. Das kann ich aber Ihnen auch noch anders zeigen. Jetzt führe ich mal einen Befehl aus, der nicht funktioniert. In diesem Fall verbinde ich auch noch Standard In. Jetzt habe ich also Standard Out verbunden, Standard Error verbunden und Standard In verbunden. Jetzt wird es interessant. "proc.communicate". ...unicate... Wie Sie vielleicht wissen, benötigt "rm" einen Wert von mir, eben "yes", weil mich der Prozess frägt, "willst du wirklich die Datei tmp/abc.txt löschen?" Ich sage in diesem Fall "yes", also kommuniziere ich mit Standard In, von diesem Subprozess, der ein "proc" repräsentiert. In diesem Fall kriege ich aber eine Fehlermeldung. Warum? Weil die Datei "tmp/abc.txt" bei mir nicht existiert. Und das sehen Sie hier. Standard Out ist diesmal leer, da ja kein Output von diesem Subprozess hier kam, aber ich krieg die Fehlermelder gemoved, "das Entfernen von..." "Datei oder Verzeichnis nicht gefunden", die Datei gibt es ja nicht. Jetzt will ich Ihnen noch ein bisschen anspruchsvolleres Beispiel zeigen. Ich will die PIPE, die Sie von der Shell vielleicht kennen, "ls | sort " nachbauen, mit Subprozess. Was macht die PIPE? "ls" gibt mir alle Einträge in meinem aktuellen Verzeichnis aus und "sort" sortiert sie dann. Wie mache ich das? Ich mause das mal ab. Sonst wird es zu kompliziert. Ich mache hier einen "proc1"auf, der "ls" ausführt. Und den verbinde ich mit Standard Out. Dann mache ich ein "proc2" auf, der "sort" ausführt. Das Entscheidende ist dieser Ausdruck hier. Standard In verbinde ich mit "proc1.stdout", das heißt, Standard In verbinde ich mit dem, was der "proc1" auf Standard Out schreibt. Jetzt muss ich noch den "proc1" schließen. Und jetzt rufe ich "proc2.communicate" auf, das heißt, ich lass' diese PIPE laufen, und damit es ein bisschen optisch ansprechender wird, gebe ich es noch schön aus, und jetzt sehen Sie, die Einträge meines Homes lexikografisch sortiert; weil ich habe genau das hier ausgeführt. "ls | sort". In dieser Lektion habe ich Ihnen das Subprozess-Modul genauer vorgestellt. Das Subprozess-Modul erlaubt Ihnen, sehr komfortabel Subprozesse aufzumachen und mit Ihnen zu kommunizieren.

Python für Systemadministratoren Grundkurs

Lernen Sie die zahlreichen Funktionen der Kernsprache und die wichtisgten Bibliotheken für den Administrationsalltag kennen.

1 Std. 53 min (22 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:10.03.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!