Odpowiedzi:
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()
.
shell=True
jeśli możesz. Posiadanie tej opcji jest jedną z zalet programu subprocess.Popen()
i jego funkcji pomocniczych.
os.system
i subprocess.call/popen/run
nie blokuje / czekać na polecenia do wykończenia: stackoverflow.com/a/14059648/4752883
os.system
jest odpowiednikiem system
polecenia systemu Unix , podczas gdy subprocess
był modułem pomocniczym stworzonym w celu zapewnienia wielu ułatwień udostępnianych przez Popen
polecenia 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 command
i 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 subprocess
zdecydowanie, ponieważ masz wszystkie udogodnienia do wykonania oraz dodatkową kontrolę nad procesem.
Podproces jest oparty na popen2 i jako taki ma wiele zalet - pełna lista w PEP jest tutaj , ale niektóre z nich to:
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.
sts = p.wait()
zamiast ostatniej linii.