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


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


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


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.


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.