Урок 8 из 8 · 20 мин · обновлено

Запуск по расписанию и что изучать дальше

Как запускать скрипты Python по расписанию: пути относительно скрипта, журнал работы через logging, Планировщик заданий Windows и cron на macOS и Linux. И куда расти дальше: pandas, автоматизация браузера, Git.

Готовим скрипт к работе без вас

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

Пути. Когда вы запускаете python report.py из папки проекта, путь Path("магазин_1.xlsx") ищется в ней. Планировщик запускает скрипт из другой папки, и файлы «пропадают». Надёжный способ — строить пути от папки, где лежит сам скрипт:

Python
from pathlib import Path

HERE = Path(__file__).parent          # папка, где лежит сам скрипт
files = sorted(HERE.glob("магазин_*.xlsx"))

Сообщения. print() при запуске по расписанию печатать некуда — экран никто не видит. Вместо него пишут журнал (лог) в файл модулем logging.

Журнал работы

Python
import logging
from pathlib import Path

HERE = Path(__file__).parent

logging.basicConfig(
    filename=HERE / "отчёт.log",
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
    encoding="utf-8",
)

try:
    files = sorted(HERE.glob("магазин_*.xlsx"))
    if not files:
        raise FileNotFoundError("нет файлов магазинов")
    logging.info("Нашли файлов: %s", len(files))
    # ... здесь собираем и отправляем отчёт, как в уроках 4 и 6
    logging.info("Отчёт готов")
except Exception:
    logging.exception("Отчёт не собран")

После удачного запуска в файле отчёт.log появятся строки:

Результат
2026-10-26 09:00:01,412 INFO Нашли файлов: 3
2026-10-26 09:00:02,087 INFO Отчёт готов

А если магазины не прислали файлы — запись об ошибке с подробностями:

Результат
2026-10-26 09:00:01,203 ERROR Отчёт не собран
Traceback (most recent call last):
  ...
FileNotFoundError: нет файлов магазинов
  • basicConfig() настраивает журнал один раз: файл, уровень важности, формат строки. %(asctime)s — время, %(levelname)s — уровень, %(message)s — текст;
  • logging.info() — обычное сообщение, logging.exception() — ошибка вместе с полным описанием, где она случилась;
  • try ... except Exception ловит любую ошибку, чтобы она попала в журнал, а не исчезла вместе с закрытым окном.

Если хочется узнавать о проблемах сразу, в блок except можно добавить отправку письма себе — как в уроке 6.

Расписание на Windows

На Windows задачи по расписанию запускает встроенный Планировщик заданий:

  1. Откройте «Пуск» и найдите «Планировщик заданий».
  2. Справа нажмите «Создать простую задачу», введите название, например «Отчёт по продажам».
  3. Триггер — «Еженедельно», понедельник, 9:00.
  4. Действие — «Запустить программу».
  5. Программа: полный путь к Python из виртуального окружения проекта, например C:\kancmarket\.venv\Scripts\pythonw.exe. pythonw запускает скрипт без чёрного окна терминала.
  6. Аргументы: имя скрипта, report.py.
  7. Рабочая папка: папка проекта, C:\kancmarket.

Python именно из .venv важен: только в нём установлены openpyxl и requests. Проверьте задачу сразу: правой кнопкой по ней → «Выполнить», затем загляните в журнал.

Учтите, что задача выполнится, только если компьютер включён. Если нужно, чтобы отчёт собирался всегда, скрипт переносят на сервер, который работает круглосуточно.

Расписание на macOS и Linux

Здесь расписание задают в cron. Откройте список задач командой:

Терминал
crontab -e

И добавьте строку:

Терминал
0 9 * * 1 /home/user/kancmarket/.venv/bin/python /home/user/kancmarket/report.py

Пять полей в начале — когда запускать: минута, час, день месяца, месяц, день недели. 0 9 * * 1 — в 0 минут 9-го часа, в любой день месяца, любой месяц, по понедельникам. Звёздочка означает «любое значение». Дальше — полные пути к Python из окружения и к скрипту. Подробнее о терминале и сервере — в курсе «Командная строка и Linux».

Что изучать дальше

Вы прошли основные инструменты автоматизации. Куда двигаться дальше, зависит от ваших задач:

Если нужно Что изучить
Таблицы на сотни тысяч строк, сложные сводные Библиотеку pandas
Сайт без API и без выгрузки в файл Автоматизацию браузера: Playwright или Selenium
Документы Word и PDF Библиотеки python-docx и pypdf
Не потерять рабочую версию скриптов Git — курс «Git и GitHub»
Данные лежат в базе SQL — курс «SQL с нуля»

Про автоматизацию браузера важно помнить: у сайтов есть правила использования, а частые автоматические запросы могут нагрузить чужой сервер. Сначала ищите официальную выгрузку или API.

Главное — не откладывать: возьмите одну свою задачу, которая повторяется каждую неделю, и автоматизируйте её. Даже скрипт на 20 строк, который экономит 15 минут в неделю, — это 12 часов в год.

Попробуйте сами. Объедините уроки курса в один скрипт report.py: собрать отчёт из файлов магазинов (урок 4), записать в журнал, сколько файлов нашлось, и отправить письма в режиме пробного запуска (урок 6). Все пути стройте от папки скрипта.

Каркас решения
Python
import logging
from pathlib import Path

HERE = Path(__file__).parent
logging.basicConfig(filename=HERE / "отчёт.log", level=logging.INFO,
                    format="%(asctime)s %(levelname)s %(message)s", encoding="utf-8")

def build_report():
    files = sorted(HERE.glob("магазин_*.xlsx"))
    if not files:
        raise FileNotFoundError("нет файлов магазинов")
    logging.info("Нашли файлов: %s", len(files))
    report_path = HERE / "Отчёт за неделю.xlsx"
    # код из урока 4: читаем файлы, считаем, сохраняем report_path
    return report_path

def send_letters(report_path):
    # код из урока 6: читаем HERE / "менеджеры.csv", собираем и отправляем письма
    logging.info("Письма отправлены")

try:
    send_letters(build_report())
except Exception:
    logging.exception("Отчёт не собран")

Каждый шаг — своя функция. Так скрипт проще читать, а если сломается отправка писем, по журналу сразу будет видно, на каком шаге.

Мини-тест · 4 вопроса

Проверьте себя

Выберите вариант, который кажется вам правильным. В конце вы увидите свой результат и объяснение к каждому вопросу.

  1. Скрипт работает, если запустить его руками, но по расписанию пишет «файл не найден». Самая вероятная причина?

  2. Зачем скрипту, который работает по расписанию, журнал logging?

  3. Что означает строка cron «0 9 * * 1 …»?

  4. Сайт показывает нужные данные, но API у него нет. Что можно попробовать?