Для большинства задач не нужны
os.system() или низкоуровневый Popen. Достаточно subprocess.run() - он запускает программу, передаёт аргументы, возвращает код завершения и позволяет получить вывод.
import subprocess
result = subprocess.run(
["git", "status", "--short"],
capture_output=True,
text=True,
check=True,
timeout=10,
)
print(result.stdout)
Что здесь происходит:
-
capture_output=True сохраняет stdout и stderr-
text=True возвращает строки вместо bytes-
check=True выбрасывает CalledProcessError, если команда завершилась с ошибкой-
timeout=10 не позволяет процессу зависнуть навсегдаОшибки лучше обрабатывать явно:
import subprocess
try:
result = subprocess.run(
["git", "status", "--short"],
capture_output=True,
text=True,
check=True,
timeout=10,
)
except subprocess.TimeoutExpired:
print("Команда выполнялась слишком долго")
except subprocess.CalledProcessError as error:
print(error.stderr)
else:
print(result.stdout)
Передавайте команду списком аргументов.
shell=True нужен редко и может создать уязвимость к внедрению команд, особенно если строка содержит пользовательские данные.subprocess.run() - простой и надёжный мост между Python и системными утилитами, Git, компиляторами, CLI-инструментами и другими программами.Подробнее:
https://pythonmorsels.com/running-subprocesses-in-python/
