Unterschied zwischen subprocess.Popen und os.system

117

Was ist der Unterschied zwischen subprocess.Popen()und os.system()?

Arovit
quelle

Antworten:

99

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().

Jacob Marmor
quelle
Sie können auch sts = p.wait()anstelle der letzten Zeile verwenden.
Sven Marnach
1
@JacobMarble Angenommen, ich rufe ein Selen-Scraping-Skript aus einem anderen Python-Skript auf. Mit welchem ​​dieser Skripte kann ich das Scraping-Skript vervollständigen und dann und erst dann die nächste Codezeile ausführen? Wie in sollte mein Scraping abgeschlossen sein, bevor die Ausführung fortgesetzt werden kann.
Prakhar Mohan Srivastava
Vielleicht erwähnen Sie auch stackoverflow.com/questions/3172470/… , um darauf hinzuweisen, dass Sie das vermeiden sollten, shell=Truewenn Sie können. Diese Option ist einer der Vorteile subprocess.Popen()und Hilfsfunktionen.
Tripleee
@PrakharMohanSrivastava Wenn Sie den Fluss blockieren und auf den Befehl warten möchten, um seine Arbeit abzuschließen,
AmirHossein
@PrakharMohanSrivastava, im Allgemeinen beides os.systemund subprocess.call/popen/runblockiert / wartet, bis der Befehl beendet ist: stackoverflow.com/a/14059648/4752883
alpha_989
46

subprocess.Popen()ist streng super-set von os.system().

Jan Hudec
quelle
10
Dies ist die vollkommen elegante Antwort.
Farsheed
22

os.systementspricht dem Unix- systemBefehl, während subprocessein Hilfsmodul erstellt wurde, um vielen der von den PopenBefehlen 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 commandund 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 subprocessmöchten, verwenden Sie sie auf jeden Fall, da Sie über alle Ausführungsmöglichkeiten sowie zusätzliche Kontrolle über den Prozess verfügen.

Senthil Kumaran
quelle
okay..dann gibt es eine Möglichkeit, sowohl os.system als auch popen in Windows Env auszuführen? Ich bin ein Neuling und muss tiefer graben ..
Arovit
Ja, Sie können sowohl os.system als auch den Unterprozess in der Windows-Umgebung verwenden. Werfen Sie einen Blick auf grundlegende Tutorials von effbot.org (Online-Buch der Python Standard Library)
Senthil Kumaran
Vorsicht - Wenn Sie auf älteren Systemen arbeiten, ist das Unterprozessmodul nicht verfügbar.
Steve Hanov
21

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:

  • mit Rohr in der Schale
  • Bessere Newline-Unterstützung
  • besserer Umgang mit Ausnahmen
Andy Mikula
quelle
2

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.

BPL
quelle