Różnica między subprocess.Popen i os.system

117

Jaka jest różnica między subprocess.Popen()i os.system()?

Arovit
źródło

Odpowiedzi:

99

Jeśli sprawdź sekcję podproces docs Pythona , można zauważyć, że jest to przykład, jak wymienić os.system()z subprocess.Popen():

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

... robi to samo, co ...

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

„Ulepszony” kod wygląda na bardziej skomplikowany, ale jest lepszy, ponieważ kiedy już się zorientujesz subprocess.Popen(), nie potrzebujesz niczego więcej. subprocess.Popen()zastępuje kilka innych narzędzi ( os.system()jest tylko jednym z nich), które były rozproszone w trzech innych modułach Pythona.

Jeśli to pomoże, pomyśl o tym subprocess.Popen()jako bardzo elastyczny os.system().

Jacob Marble
źródło
Możesz także użyć sts = p.wait()zamiast ostatniej linii.
Sven Marnach
1
@JacobMarble, więc przypuśćmy, że wywołuję skrypt do skrobania selenu z innego skryptu Pythona, który z nich pozwoliłby mi ukończyć skrypt skrobania, a następnie i dopiero wtedy wykonać następną linię kodu? Tak jak w przypadku, moje skrobanie powinno zakończyć się, zanim będzie można kontynuować wykonanie.
Prakhar Mohan Srivastava
Może również wspomnij o stackoverflow.com/questions/3172470/…, aby wskazać, że powinieneś unikać, shell=Truejeśli możesz. Posiadanie tej opcji jest jedną z zalet programu subprocess.Popen()i jego funkcji pomocniczych.
tripleee
@PrakharMohanSrivastava Jeśli chcesz zablokować przepływ i poczekać, aż polecenie zakończy pracę, sprawdź: stackoverflow.com/a/2837319/5252192
AmirHossein
@PrakharMohanSrivastava generalnie oba os.systemi subprocess.call/popen/runnie blokuje / czekać na polecenia do wykończenia: stackoverflow.com/a/14059648/4752883
alpha_989
47

subprocess.Popen() jest ścisłym super zestawem os.system() .

Jan Hudec
źródło
10
Oto pełna elegancka odpowiedź.
Farsheed
23

os.systemjest odpowiednikiem systempolecenia systemu Unix , podczas gdy subprocessbył modułem pomocniczym stworzonym w celu zapewnienia wielu ułatwień udostępnianych przez Popenpolecenia z łatwiejszym i kontrolowanym interfejsem. Zostały one zaprojektowane podobnie do polecenia Unix Popen .

system()wykonuje polecenie określone w poleceniu przez wywołanie /bin/sh -c commandi powraca po zakończeniu polecenia

Natomiast:

popen()Funkcja otwiera proces tworząc rurę, rozwidlone i wywołując powłokę.

Jeśli zastanawiasz się, którego użyć, użyj subprocesszdecydowanie, ponieważ masz wszystkie udogodnienia do wykonania oraz dodatkową kontrolę nad procesem.

Senthil Kumaran
źródło
okej .. czy jest jakiś sposób mogę wykonać zarówno os.system i popen w środowisku Windows? Jestem nowicjuszem i muszę kopać głębiej ...
Arovit
Tak, w środowisku Windows można używać zarówno os.system, jak i podprocesu. Zapoznaj się z podstawowymi samouczkami z effbot.org (książka online Python Standard Library)
Senthil Kumaran,
Ostrożnie - jeśli pracujesz na starszych systemach, moduł podprocesu nie jest dostępny.
Steve Hanov
21

Podproces jest oparty na popen2 i jako taki ma wiele zalet - pełna lista w PEP jest tutaj , ale niektóre z nich to:

  • za pomocą rury w powłoce
  • lepsze wsparcie dla nowej linii
  • lepsza obsługa wyjątków
Andy Mikula
źródło
2

Podczas uruchamiania Pythona (cpython) w systemie Windows system <built-in function system> os.system będzie wykonywany pod zasłonami _wsystem, podczas gdy jeśli używasz systemu operacyjnego innego niż Windows, będzie on używał systemu .

Wręcz przeciwnie, Popen powinien używać CreateProcess w oknach i _posixsubprocess.fork_exec w systemach operacyjnych opartych .

To powiedziawszy, ważna rada pochodzi od os.system docs, która mówi:

Moduł podprocesów zapewnia bardziej zaawansowane narzędzia do tworzenia nowych procesów i pobierania ich wyników; używanie tego modułu jest lepsze niż korzystanie z tej funkcji. Zapoznaj się z sekcją Zastępowanie starszych funkcji modułem podprocesu w dokumentacji podprocesu, aby uzyskać kilka pomocnych przepisów.

BPL
źródło