subprocess — Управление подпроцессами
Модуль subprocess позволяет запускать новые процессы, подключаться к их каналам ввода/вывода/ошибок и получать коды возврата.
import subprocess
Функция run()
Для большинства задач используется subprocess.run().
import subprocess
# Просто запуск (вывод в консоль)
subprocess.run(["ls", "-l"])
# Перехват вывода (capture_output=True) и работа со строками (text=True)
result = subprocess.run(["echo", "Привет"], capture_output=True, text=True)
print(result.stdout) # "Привет\n"
print(result.returncode) # 0 (успех)
Обработка ошибок
Если передать check=True, функция выбросит исключение при ошибке (коде возврата != 0):
try:
subprocess.run(["ls", "missing.txt"], check=True, capture_output=True)
except subprocess.CalledProcessError as e:
print(f"Ошибка с кодом {e.returncode}")
Класс Popen
Для тяжелых задач или работы с процессами в фоне используется класс Popen.
import subprocess
# Запуск в фоне
p = subprocess.Popen(["sleep", "3"])
print("Процесс работает...")
# Ожидание завершения
p.wait()
print("Готово!")
Безопасность (shell=True)
Критично: Никогда не используйте
shell=Trueс непроверенным пользовательским вводом во избежание shell-инъекций.
user_input = "file.txt; rm -rf /"
# БЕЗОПАСНО: список аргументов
subprocess.run(["cat", user_input])
# ОПАСНО: shell выполнит команду rm!
# subprocess.run(f"cat {user_input}", shell=True)
Частые ошибки
- Использование
os.system()— устаревший подход, используйтеsubprocess. - Строка вместо списка — передавайте команды списком
["git", "status"]. - Забыт
text=True— без него вывод будет в байтахb"строка".
Официальная документация
subprocess — Subprocess management
Полный справочник API (API Reference)
Основные функции
| Функция/Класс | Описание |
|---|---|
subprocess.run(args, *, capture_output=True, text=True, check=True) |
Рекомендуемая функция. Запускает команду, дожидается её выполнения и возвращает объект результата CompletedProcess. |
subprocess.CompletedProcess |
Результат функции run(). Содержит код возврата и вывод команды. |
subprocess.Popen(args) |
Низкоуровневый класс. Запускает процесс в фоне, не блокируя основной поток выполнения Python до ручного вызова .wait(). |
Атрибуты CompletedProcess (возвращаемое run() значение)
| Атрибут | Описание |
|---|---|
returncode |
Код возврата операционной системы (0 - успех, остальное - код ошибки). |
stdout |
Вывод в консоль от выполненной программы (в виде строки, если стоял флаг text=True). |
stderr |
Вывод ошибок в консоль (красный лог). |