Відповіді:
Відповідь @ milne працює, але subprocess.call()
дає мало відгуків.
Я вважаю за краще використовувати, subprocess.check_output()
щоб ви могли проаналізувати, що було надруковано на stdout:
import subprocess
res = subprocess.check_output(["sudo", "apt", "update"])
for line in res.splitlines():
# process the output line by line
check_output
видає помилку при нульовому виході викликаної команди
Зауважте, що це не посилається на bash
іншу оболонку, якщо ви не вказуєте shell
аргумент ключового слова для функції (те саме стосується subprocess.call()
, і ви не повинні, якщо не потрібно, оскільки це створює загрозу безпеці), воно безпосередньо викликає командування.
Якщо ви виявите, що ви робите багато (різних) викликів команд з Python, ви можете подивитися на плумбум . З цим ви можете зробити (IMO) більш читабельним:
from plumbum.cmd import sudo, apt, echo, cut
res = sudo[apt["update"]]()
chain = echo["hello"] | cut["-c", "2-"]
chain()
os.popen
або os.system
), наприклад res = os.popen('sudo apt update').read()
:? @Anthon
subprocess
хоча os.system
і os.popen
вже існувало. Такі PEP є нетривіальними для їх прийняття. Кілька людей думали про це набагато більше, ніж ви або я коли-небудь буду. І subprocess
вдосконалюється з 2003 року, інші просто все ще існують для відсталої сумісності. Чи червоніє os.system
сторінка керівництва: модуль підпроцесу забезпечує більш потужні засоби для нерестування нових процесів та отримання їх результатів; використання цього модуля переважно, ніж використання цієї функції.
sudo
покликання лише зробить це більш суворим. Можливо, використання python-apt є кращим рішенням (я сам цього не вивчав).
The підпроцесу призначений для цього:
import subprocess
subprocess.call(["sudo", "apt", "update"])
Якщо ви хочете, щоб сценарій припинився, якщо команда не вдалася, ви можете розглянути можливість використання check_call()
замість розбору коду повернення самостійно:
subprocess.check_call(["sudo", "apt", "update"])
Traceback (most recent call last): File "/home/Dremor/test.py", line 3, in <module> subprocess.call('sudo', 'yum', 'update') File "/usr/lib64/python3.4/subprocess.py", line 537, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib64/python3.4/subprocess.py", line 767, in __init__ raise TypeError("bufsize must be an integer") TypeError: bufsize must be an integer
(Я використовую yum, як я використовую Fedora в якості основної ОС)
subprocess.call()
блокування поки subprocess.Popen()
не блокується ..
Також ви можете використовувати "os.popen".
Приклад:
import os
command = os.popen('ls -al')
print(command.read())
print(command.close())
Вихід:
total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root 77 ago 13 21:53 test.py
None
використовувати підпроцесорний модуль
import subprocess
command = 'sudo apt update'
subprocess.check_call(command.split())