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

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

Author: Simon, 2011-01-27

5 answers

Jeśli sprawdzisz sekcję podprocesu W Python docs , zauważysz, że istnieje przykład, jak zastąpić os.system() przez subprocess.Popen():

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

...robi to samo co...

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

" ulepszony " kod wygląda bardziej skomplikowanie, ale jest lepszy, ponieważ kiedy już wiesz subprocess.Popen(), nie potrzebujesz niczego więcej. subprocess.Popen() zastępuje kilka innych narzędzi (os.system() jest tylko jednym z nich), które zostały rozproszone po trzech innych modułach Pythona.

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

 110
Author: Jacob Marble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-04 18:40:08

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

 53
Author: Jan Hudec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 19:35:27

os.system jest odpowiednikiem Uniksa system command, podczas gdy {[2] } był modułem pomocniczym stworzonym w celu zapewnienia wielu udogodnień dostarczanych przez komendy Popen z łatwiejszym i sterowalnym interfejsem. Zostały one zaprojektowane podobnie do polecenia Unix popen.

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

}

Funkcja popen() otwiera proces tworząc rura, rozwidlenie i / align = "left" /

Jeśli zastanawiasz się, którego z nich użyć, użyj subprocess zdecydowanie dlatego, że masz wszystkie udogodnienia Do wykonania, plus dodatkową kontrolę nad procesem.

 29
Author: Senthil Kumaran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-22 17:49:45

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

  • używanie rury w powłoce
  • lepsza obsługa newline
  • lepsza obsługa wyjątków
 22
Author: Andy Mikula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 06:09:21

Podczas uruchamiania Pythona (cpython) w systemie windows <built-in function system> os.system będzie działał pod zasłoną _wsystempodczas gdy jeśli używasz systemu operacyjnego innego niż windows, będzie używał system.

Przeciwnie, Popen powinien używać CreateProcess w windows i _posixsubprocess.fork_exec w systemach operacyjnych opartych na posix.

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

Moduł podprocesu zapewnia mocniejsze urządzenia do tarła nowych procesów i odzyskiwanie ich wyników; korzystanie z tego modułu jest lepiej używać tej funkcji. Zobacz zastępowanie starszych funkcji z sekcją moduł podprocesu w dokumentacji podprocesu dla kilka przydatnych przepisów.

 4
Author: BPL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 03:19:49