Різниця між підпроцесом.Попен та ОС.системою


Відповіді:


99

Якщо ви переглянете розділ підпроцесів документів Python , ви помітите, що є приклад того, як замінити os.system()на subprocess.Popen():

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

... робить те саме, що і ...

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

"Вдосконалений" код виглядає складніше, але краще, тому що, коли ви знаєте subprocess.Popen(), вам більше нічого не потрібно. subprocess.Popen()замінює кілька інших інструментів ( os.system()це лише один із тих), які були розкидані по трьох інших модулях Python.

Якщо це допомагає, подумайте subprocess.Popen()як про дуже гнучку os.system().


Ви також можете використовувати sts = p.wait()замість останнього рядка.
Свен Марнах

1
@JacobMarble так припустимо, що я викликаю скрипт скреблення селену з іншого сценарію python, який із них дозволив би мені виконати сценарій скреблінгу, а потім і лише потім виконати наступний рядок коду? Як і в моєму, скреблінг повинен завершитись, перш ніж виконання може продовжуватися.
Прахар Мохан Срівастава

Можливо, також згадайте stackoverflow.com/questions/3172470/…, щоб зазначити, що вам слід уникати, shell=Trueякщо можете. Наявність цього варіанту є однією з переваг subprocess.Popen()та його допоміжних функцій.
трійка

@PrakharMohanSrivastava Якщо ви хочете , щоб блокувати потік і чекати команди , щоб завершити перевірку роботи з: stackoverflow.com/a/2837319/5252192
AmirHossein

@PrakharMohanSrivastava, в загальному , як os.systemі subprocess.call/popen/runробить блок / очікування для завершення роботи команди: stackoverflow.com/a/14059648/4752883
alpha_989


23

os.systemеквівалентна systemкоманді Unix , в той час subprocessяк допоміжний модуль створений, щоб забезпечити багато зручностей, що надаються Popenкомандами, простішим та керованим інтерфейсом. Вони були розроблені аналогічно команді Unix Popen .

system()виконує команду, вказану в команді при виклику /bin/sh -c command, і повертається після завершення команди

При цьому:

popen()Функція відкриває процес створення каналу, розгалуження, і виклику оболонки.

Якщо ви думаєте, який з них використовувати, то використовуйте subprocessобов'язково, оскільки у вас є всі можливості для виконання, а також додатковий контроль за процесом.


гаразд ... тоді є якийсь спосіб я можу виконати як OS.system, так і відкрити в Windows ENV? я новачок і мені потрібно копати глибше ..
Arovit

Так, ви можете використовувати як os.system, так і підпроцес у середовищі Windows. Подивіться на основні підручники з effbot.org (Python Standard Library онлайн книга)
Senthil Kumaran

Обережно - якщо ви працюєте в старих системах, підпроцесовий модуль недоступний.
Стів Ганов

21

Підпроцес заснований на popen2, і як такий має ряд переваг - тут є повний список у PEP , але деякі з них:

  • використовуючи трубу в оболонці
  • краща підтримка нового рядка
  • краще поводження з винятками

2

Під час запуску python (cpython) на windows <built-in function system> os.system буде виконуватися під _ шторою _wsystem, тоді як якщо ви використовуєте OS Windows, який не використовується, він буде використовувати систему .

Навпаки, Popen повинен використовувати CreateProcess у Windows та _posixsubprocess.fork_exec в операційних системах на базі posix.

З цього приводу важлива порада надходить з документів os.system , де сказано:

Підпроцесорний модуль забезпечує більш потужні засоби для нерестування нових процесів та отримання їх результатів; використання цього модуля краще використовувати цю функцію. Деякі корисні рецепти див. У розділі Заміна старих функцій на модуль підпроцесу в документації про підпроцес.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.