Frage Unterschied zwischen subprocess.Popen und os.system


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


76
2018-01-27 06:04


Ursprung


Antworten:


Wenn Sie die Teilprozessabschnitt der Python-DokumenteSie werden feststellen, dass es ein Beispiel für das Ersetzen gibt os.system() mit subprocess.Popen():

sts = os.system("mycmd" + " myarg")

... macht dasselbe wie ...

sts = Popen("mycmd" + " myarg", shell=True).wait()

Der "verbesserte" Code sieht komplizierter aus, aber es ist besser, wenn Sie es erst einmal wissen subprocess.Popen(), du brauchst nichts anderes. subprocess.Popen() ersetzt mehrere andere Werkzeuge (os.system() ist nur eine davon), die in drei anderen Python-Modulen verstreut waren.

Wenn es hilft, denke an subprocess.Popen() als sehr flexibel os.system().


64
2018-01-27 06:56



subprocess.Popen() ist streng Super-Set von os.system().


28
2018-01-27 06:17



Der Subprozess basiert auf popen2 und hat daher eine Reihe von Vorteilen - es gibt eine vollständige Liste im PEP hier, aber einige sind:

  • mit Rohr in der Schale
  • Bessere Newline-Unterstützung
  • besserer Umgang mit Ausnahmen

19
2018-01-27 06:09



os.system entspricht Unix System Befehl, während der Unterprozess ein Hilfsmodul war, das erstellt wurde, um viele der von den Popen-Befehlen bereitgestellten Funktionen mit einer einfacheren und kontrollierbaren Schnittstelle zu versehen. Diese wurden ähnlich wie die Unix Popen Befehl.

system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed

wohingegen

The popen() function opens a process by creating a pipe, forking, and invoking the shell.

Wenn du denkst, welche zu verwenden, dann benutze Unterprozess Auf jeden Fall, weil Sie alle Möglichkeiten zur Ausführung und zusätzliche Kontrolle über den Prozess haben.


18
2018-01-27 07:07



Beim Ausführen von Python (Cpython) auf Windows die <built-in function system>  os.System wird unter den Vorhängen ausführen _wsystem während, wenn Sie ein Nicht-Windows-Betriebssystem verwenden, wird es verwenden System.

Im Gegensatz sollte Popen verwenden ErstellenProzess auf Windows und _posixsubprocess.fork_exec in posix-basierten Betriebssystemen.

Das heißt, ein wichtiger Ratschlag kommt von os.System Dokumente, die sagen:

Das Subprozess-Modul bietet leistungsfähigere Möglichkeiten zum Laichen   neue Prozesse und Abrufen ihrer Ergebnisse; Verwenden dieses Moduls ist   vorzuziehen, diese Funktion zu verwenden. Siehe Ersetzen älterer Funktionen   mit dem Unterprozess Modulabschnitt in der Subprozessdokumentation für   einige hilfreiche Rezepte.


1
2018-03-09 03:19