Ответы:
ответ @ милна работает, но subprocess.call()
дает мало отзывов.
Я предпочитаю использовать, subprocess.check_output()
чтобы вы могли проанализировать, что было напечатано на стандартный вывод:
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, возможно, вы захотите взглянуть на plumbum . С этим вы можете сделать (ИМО) более читабельным:
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 - лучшее решение (я сам не рассматривал это).
Модуль подпроцесса предназначен для этого:
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())