Unterschied zwischen subprocess.Popen und os.system


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


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


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.


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.