Скрипты и автоматизация — Примеры

Пример 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())

Если скрипт создаёт недостающее и продолжает работу, его можно повторить после частичного сбоя, и именно это делает автоматизацию безопасной без присмотра. Библиотека путей обрабатывает разделители, расширения и проверку существования на любой платформе, поэтому одно выражение продолжает работать там, где склеенные строки — нет. Однако ошибка — считать скрипт одноразовым: то, что должно случиться ровно один раз, требует человека рядом, а это противоречит смыслу автоматизации.