Відповіді:
Якщо ви переглянете розділ підпроцесів документів 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()
.
shell=True
якщо можете. Наявність цього варіанту є однією з переваг subprocess.Popen()
та його допоміжних функцій.
os.system
і subprocess.call/popen/run
робить блок / очікування для завершення роботи команди: stackoverflow.com/a/14059648/4752883
os.system
еквівалентна system
команді Unix , в той час subprocess
як допоміжний модуль створений, щоб забезпечити багато зручностей, що надаються Popen
командами, простішим та керованим інтерфейсом. Вони були розроблені аналогічно команді Unix Popen .
system()
виконує команду, вказану в команді при виклику/bin/sh -c command
, і повертається після завершення команди
При цьому:
popen()
Функція відкриває процес створення каналу, розгалуження, і виклику оболонки.
Якщо ви думаєте, який з них використовувати, то використовуйте subprocess
обов'язково, оскільки у вас є всі можливості для виконання, а також додатковий контроль за процесом.
Підпроцес заснований на popen2, і як такий має ряд переваг - тут є повний список у PEP , але деякі з них:
Під час запуску python (cpython) на windows <built-in function system>
os.system буде виконуватися під _ шторою _wsystem, тоді як якщо ви використовуєте OS Windows, який не використовується, він буде використовувати систему .
Навпаки, Popen повинен використовувати CreateProcess у Windows та _posixsubprocess.fork_exec в операційних системах на базі posix.
З цього приводу важлива порада надходить з документів os.system , де сказано:
Підпроцесорний модуль забезпечує більш потужні засоби для нерестування нових процесів та отримання їх результатів; використання цього модуля краще використовувати цю функцію. Деякі корисні рецепти див. У розділі Заміна старих функцій на модуль підпроцесу в документації про підпроцес.
sts = p.wait()
замість останнього рядка.