Antworten:
Wenn Sie die Besuche subprocess Abschnitt der Python - Dokumentation , werden Sie feststellen , es ist ein Beispiel dafür , wie zu ersetzen os.system()
mit subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... macht das Gleiche wie ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
Der "verbesserte" Code sieht komplizierter aus, ist aber besser, weil Sie, sobald Sie es wissen subprocess.Popen()
, nichts mehr benötigen. subprocess.Popen()
ersetzt mehrere andere Werkzeuge (os.system()
ist nur eines davon), die auf drei andere Python-Module verteilt waren.
Wenn es hilft, denken Sie an subprocess.Popen()
eine sehr flexible os.system()
.
shell=True
wenn Sie können. Diese Option ist einer der Vorteile subprocess.Popen()
und Hilfsfunktionen.
os.system
und subprocess.call/popen/run
blockiert / wartet, bis der Befehl beendet ist: stackoverflow.com/a/14059648/4752883
os.system
entspricht dem Unix- system
Befehl, während subprocess
ein Hilfsmodul erstellt wurde, um vielen der von den Popen
Befehlen bereitgestellten Funktionen eine einfachere und steuerbarere Schnittstelle zu bieten. Diese wurden ähnlich wie der Befehl Unix Popen entworfen .
system()
führt einen im Befehl angegebenen Befehl durch Aufrufen aus/bin/sh -c command
und kehrt nach Abschluss des Befehls zurück
Wohingegen:
Die
popen()
Funktion öffnet einen Prozess durch Erstellen einer Pipe, Verzweigen und Aufrufen der Shell.
Wenn Sie überlegen, welche Sie verwenden subprocess
möchten, verwenden Sie sie auf jeden Fall, da Sie über alle Ausführungsmöglichkeiten sowie zusätzliche Kontrolle über den Prozess verfügen.
Der Unterprozess basiert auf popen2 und hat als solcher eine Reihe von Vorteilen - es gibt hier eine vollständige Liste im PEP , aber einige sind:
Wenn Sie Python (cpython) unter Windows <built-in function system>
ausführen, wird das Betriebssystem unter dem Vorhang _wsystem ausgeführt, während bei Verwendung eines Nicht-Windows- Betriebssystems das System verwendet wird .
Im Gegensatz dazu sollte Popen CreateProcess unter Windows und _posixsubprocess.fork_exec in posix-basierten Betriebssystemen verwenden.
Ein wichtiger Ratschlag stammt jedoch aus den Dokumenten von os.system , in denen es heißt:
Das Unterprozessmodul bietet leistungsfähigere Funktionen zum Auslösen neuer Prozesse und zum Abrufen ihrer Ergebnisse. Die Verwendung dieses Moduls ist der Verwendung dieser Funktion vorzuziehen. Einige hilfreiche Rezepte finden Sie im Abschnitt Ersetzen älterer Funktionen durch das Unterprozessmodul in der Unterprozessdokumentation.
sts = p.wait()
anstelle der letzten Zeile verwenden.