Відповіді:
Якщо ви переглянете розділ підпроцесів документів 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()замість останнього рядка.