Модуль subprocess в Python
subprocess— модуль в стандартной библиотеке Python, используемый для создания и управления подпроцессами.
subprocessОн позволяет выполнять внешние команды в программах на Python и взаимодействовать с этими командами.
Черезsubprocessмодуль, вы можете выполнять системные команды, вызывать другие программы и получать их вывод или сообщения об ошибках.
Почему стоит использовать модуль subprocess?
В Python иногда нам нужно выполнять системные команды или вызывать другие программы для выполнения конкретных задач. Например, вам может потребоваться запустить команду оболочки, запустить внешнее приложение или взаимодействовать с инструментом командной строки.subprocessМодуль предоставляет безопасный и гибкий способ решения этих задач.
По сравнению с более раннимиos.system()илиos.popen()подходами,subprocessмодуль предоставляет более мощную функциональность и лучший контроль. Он позволяет более тонко управлять потоками ввода, вывода и ошибок подпроцессов и может обрабатывать более сложные сценарии.
Основные возможности модуля subprocess
1. Выполнение внешних команд
subprocess.run()ДаsubprocessОдна из наиболее часто используемых функций в модуле. Она может выполнить внешнюю команду и дождаться завершения команды. Вот простой пример:
Пример
# Выполнить простую команду оболочки
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
# Вывести вывод команды
print(result.stdout)
В этом примере,subprocess.run()выполнилls -lкоманду и захватил вывод вresult.stdoutрезультат.
2. Обработка ввода и вывода
subprocessМодуль позволяет управлять потоками ввода, вывода и ошибок подпроцессов. Вы можете передавать данные в стандартный ввод подпроцесса или читать данные из стандартного вывода и стандартного потока ошибок подпроцесса. Вот пример:
Пример
# Выполнить команду и передать ввод подпроцессу
result = subprocess.run(['grep', 'python'], input='hello\npython\nworld', capture_output=True, text=True)
# Вывести вывод команды
print(result.stdout)
В этом примере,subprocess.run()выполнилgrep pythonкоманду и передали строку'hello\npython\nworld'в качестве входных данных для подпроцесса.
3. Обработка ошибок
subprocessМодуль также позволяет обрабатывать ошибки подпроцессов. Если подпроцесс возвращает ненулевой код состояния выхода,subprocess.run()он возбудитCalledProcessErrorисключение.result.returncodeВы можете проверить
Пример
try:
result = subprocess.run(['ls', 'nonexistent_file'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
print(f"Command failed with return code {e.returncode}")
print(f"Error output: {e.stderr}")
Примерsubprocess.run()В этом примере,ls nonexistent_fileвыполнилCalledProcessErrorкоманду. Поскольку файл не существует, команда завершилась с ошибкой и возбудила
Расширенное использование модуля subprocess
1. Использование класса Popen
subprocess.Popen1. Использование класса PopenPopenКласс предоставляет низкоуровневый интерфейс, который позволяет более гибко управлять подпроцессами. Вы можете использовать
Пример
Пример
process = subprocess.Popen(['ping', 'google.com'], stdout=subprocess.PIPE, text=True)
# Запуск подпроцесса
while True:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
print(output.strip())
# Чтение вывода подпроцесса
return_code = process.poll()
print(f"Процесс завершен с кодом возврата {return_code}")
# Получить код завершения подпроцессаsubprocess.PopenВ этом примере,ping google.comзапустил
2. Использование каналов
subprocess2. Использование каналов
Пример
Пример
p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', 'py'], stdin=p1.stdout, stdout=subprocess.PIPE, text=True)
# Использовать канал для соединения двух команд
output = p2.communicate()[0]
print(output)
# Получить итоговый выводls -lВ этом примере,grep pyвывод команды передаётся вpyкоманда, и итоговый вывод содержит
Общие методы, классы и параметры модуля subprocess
Ниже приведено описание общих методов, классов и параметров модуля subprocess Python, включая описания функциональности и примеры:
Основные методы модуля subprocess
| Метод | Описание | Пример |
|---|---|---|
subprocess.run() | Выполнить команду и дождаться завершения (рекомендуется) | subprocess.run(["ls", "-l"], capture_output=True, text=True) |
subprocess.Popen() | Создать подпроцесс (низкоуровневое управление) | proc = subprocess.Popen(["ping", "google.com"], stdout=subprocess.PIPE) |
subprocess.call() | Выполнить команду и вернуть код завершения (устаревший) | exit_code = subprocess.call(["python", "--version"]) |
subprocess.check_call() | Выполнить команду и возбудить исключение при ошибке | subprocess.check_call(["git", "commit"]) |
subprocess.check_output() | Выполнить команду и вернуть вывод (устаревший) | output = subprocess.check_output(["date"], text=True) |
Атрибуты объекта subprocess.CompletedProcess (возвращаемый объект метода run())
| Attribute | Описание |
|---|---|
args | Список аргументов выполненной команды |
returncode | Код состояния завершения процесса (0 означает успех) |
stdout | Содержимое стандартного вывода (если заданоcapture_output) |
stderr | Содержимое стандартного потока ошибок (если заданоcapture_output) |
Общие методы/атрибуты класса subprocess.Popen
| Метод/атрибут | Описание | Пример |
|---|---|---|
poll() | Проверить, завершился ли процесс (возвращаетNoneTrue, указывающее, что процесс выполняется) | if proc.poll() is None: print("Running") |
wait() | Блокировать до завершения процесса | proc.wait() |
communicate() | Интерактивный ввод/вывод | stdout, stderr = proc.communicate(input="data") |
terminate() | Отправить сигнал завершения (SIGTERM) | proc.terminate() |
kill() | Принудительно завершить процесс (SIGKILL) | proc.kill() |
stdin | Стандартный поток ввода процесса | proc.stdin.write("input") |
stdout | Стандартный поток вывода процесса | print(proc.stdout.read()) |
stderr | Стандартный поток ошибок процесса | errors = proc.stderr.read() |
Общие описания параметров (применимо к run() и Popen())
| Параметр | Описание | Пример значения |
|---|---|---|
args | Команда (список или строка) | ["ls", "-l"]или"ls -l" |
stdin | Конфигурация стандартного ввода | subprocess.PIPE(pipe),None(inherit) |
stdout | Конфигурация стандартного вывода | subprocess.PIPE、open('log.txt', 'w') |
stderr | Конфигурация стандартного потока ошибок | subprocess.STDOUT(объединён со stdout) |
shell | Выполнять ли через Shell | True(поддерживает строковые команды) |
cwd | Путь к рабочей директории | "/tmp" |
env | Пользовательские переменные среды | {"PATH": "/usr/bin"} |
timeout | Тайм-аут (секунды) | 30 |
text | Является ли ввод/вывод строкой (а не байтами) | True |
Пример
Выполнить команду и перехватить вывод:
Пример
print(result.stdout) # Вывод: "Hello\n"
Выполнить сложные команды через Shell:
subprocess.run("grep 'error' log.txt | wc -l", shell=True, check=True)Получить поток вывода в реальном времени:Пример
while True:
line = proc.stdout.readline()
if not line: break
print(line.decode().strip())
Управление тайм-аутом:
Пример
subprocess.run(["sleep", "10"], timeout=5)
except subprocess.TimeoutExpired:
print("Время ожидания команды истекло!")