Скрипты и автоматизация — Примеры
Пример 1 — Дочерний процесс, падение которого проигнорировано
Ночная задача рендерит каталог и переходит к следующему этапу, а команда собирается строкой, поэтому сбой на шаге рендеринга остаётся незамеченным, пока позже не появится пустой вывод. Перепишите так, чтобы провалившаяся команда останавливала задачу.
import os
def render(source, target):
os.system("python render.py " + source + " " + target)
print("rendered")
Решение
import subprocess
from pathlib import Path
def render(source: Path, target: Path) -> None:
result = subprocess.run(
["python", "render.py", str(source), str(target)],
capture_output=True,
text=True,
)
if result.returncode != 0:
raise RuntimeError(result.stderr.strip())
Передача списка аргументов снимает правила кавычек, поэтому путь с пробелом больше не может изменить смысл команды, а проверка кода возврата превращает молчаливый сбой в остановленную задачу. Запись хода работы в поток ошибок оставляет стандартный вывод чистым для данных, которые может читать тот, кто вызвал скрипт, и это важно с первой же минуты, как скрипт попадает в конвейер. Обычная ошибка — считать, что команда сработала, раз она ничего не напечатала.
Пример 2 — Скрипт, падающий на втором запуске
Скрипт отчёта создаёт выходной каталог и пишет сводку: один раз он работает, а повторная попытка после частичного сбоя останавливается с ошибкой, и каталог приходится чистить руками. Сделайте его безопасным для двух запусков.
from pathlib import Path
out = Path("build", "report")
out.mkdir() # падает, если каталог уже есть
(out / "summary.txt").write_text(summarise())
Решение
from pathlib import Path
out = Path("build", "report")
out.mkdir(parents=True, exist_ok=True) # второй запуск переиспользует его
(out / "summary.txt").write_text(summarise())
Если скрипт создаёт недостающее и продолжает работу, его можно повторить после частичного сбоя, и именно это делает автоматизацию безопасной без присмотра. Библиотека путей обрабатывает разделители, расширения и проверку существования на любой платформе, поэтому одно выражение продолжает работать там, где склеенные строки — нет. Однако ошибка — считать скрипт одноразовым: то, что должно случиться ровно один раз, требует человека рядом, а это противоречит смыслу автоматизации.