Python выполнить скрипт по времени

schedule¶

Python job scheduling for humans. Run Python functions (or any other callable) periodically using a friendly syntax.

  • A simple to use API for scheduling jobs, made for humans.
  • In-process scheduler for periodic jobs. No extra processes needed!
  • Very lightweight and no external dependencies.
  • Excellent test coverage.
  • Tested on Python 3.7, 3.8, 3.9, 3.10 and 3.11

Example ¶

import schedule import time def job(): print("I'm working. ") schedule.every(10).minutes.do(job) schedule.every().hour.do(job) schedule.every().day.at("10:30").do(job) schedule.every().monday.do(job) schedule.every().wednesday.at("13:15").do(job) schedule.every().day.at("12:42", "Europe/Amsterdam").do(job) schedule.every().minute.at(":17").do(job) while True: schedule.run_pending() time.sleep(1) 

When not to use Schedule¶

Let’s be honest, Schedule is not a ‘one size fits all’ scheduling library. This library is designed to be a simple solution for simple scheduling problems. You should probably look somewhere else if you need:

  • Job persistence (remember schedule between restarts)
  • Exact timing (sub-second precision execution)
  • Concurrent execution (multiple threads)
  • Localization (workdays or holidays)

Schedule does not account for the time it takes for the job function to execute. To guarantee a stable execution schedule you need to move long-running jobs off the main-thread (where the scheduler runs). See Parallel execution for a sample implementation.

Read More¶

  • Installation
    • Python version support
    • Dependencies
    • Installation instructions
    • Run a job every x minute
    • Use a decorator to schedule a job
    • Pass arguments to a job
    • Cancel a job
    • Run a job once
    • Get all jobs
    • Cancel all jobs
    • Get several jobs, filtered by tags
    • Cancel several jobs, filtered by tags
    • Run a job at random intervals
    • Run a job until a certain time
    • Time until the next execution
    • Run all jobs now, regardless of their scheduling
    • Timezone in .at()
    • Daylight Saving Time
    • Example
    • Customize logging
    • AttributeError: ‘module’ object has no attribute ‘every’
    • ModuleNotFoundError: No module named ‘schedule’
    • ModuleNotFoundError: ModuleNotFoundError: No module named ‘pytz’
    • Does schedule support time zones?
    • What if my task throws an exception?
    • How can I run a job only once?
    • How can I cancel several jobs at once?
    • How to execute jobs in parallel?
    • How to continuously run the scheduler without blocking the main thread?
    • Another question?
    • Main Interface
    • Classes
    • Exceptions
    • Preparing for development
    • Running tests
    • Formatting the code
    • Compiling documentation
    • Publish a new version

    Issues¶

    If you encounter any problems, please file an issue along with a detailed description. Please also use the search feature in the issue tracker beforehand to avoid creating duplicates. Thank you 😃

    About Schedule¶

    Inspired by Adam Wiggins’ article “Rethinking Cron” and the clockwork Ruby module.

    Distributed under the MIT license. See LICENSE.txt for more information.

    Thanks to all the wonderful folks who have contributed to schedule over the years:

    • mattss
    • mrhwick
    • cfrco
    • matrixise
    • abultman
    • mplewis
    • WoLfulus
    • dylwhich
    • fkromer
    • alaingilbert
    • Zerrossetto
    • yetingsky
    • schnepp
    • grampajoe
    • gilbsgilbs
    • Nathan Wailes
    • Connor Skees
    • qmorek
    • aisk
    • MichaelCorleoneLi
    • sijmenhuizenga
    • eladbi
    • chankeypathak
    • vubon
    • gaguirregabiria
    • rhagenaars
    • Skenvy
    • zcking
    • Martin Thoma
    • ebllg
    • fredthomsen
    • biggerfisch
    • sosolidkk
    • rudSarkar
    • chrimaho
    • jweijers
    • Akuli
    • NaelsonDouglas
    • SergBobrovsky
    • CPickens42
    • emollier
    • sunpro108

    Источник

    Код на python, сервер и Cron. Запускаем код на сервере по времени

    У меня была задача «Собирать статистику постов в vk каждый час». Я не являюсь разработчиком или DevOps специалистом. Поэтому мой способ решения задачи сложился из поисковых запросов, личного опыта, советов друзей и коллег.

    Решение я разбил на 2 части:

    В этой статье мы рассмотрим реализацию 2-го пункта. Если у вас нет 2 пункта подойдет любой другой код, которые требуется запускать по расписанию.

    На схеме это будет выглядеть следующим образом.

    Код на python публикуем на сервер через github, устанавливаем docker. В crontab задаем интервал для запуска docker контейнера

    Подготавливаем данные для Docker

    Про Docker написано очень много статей, поэтому я не буду писать еще раз, что это и для чего используется. В контексте данной статьи Docker будет частью нашего решения. В следующем разделе будет ссылка на материал по теме Docker, который помог мне.

    * noted-point файл с расширением json, который используется в коде на python

    1. Создаем файл requrements.txt
    2. Настраиваем Dockerfile
    3. Настраиваем переменное окружение в коде python
    4. Оставляем словарь, который использует google sheet api*

    requrements.txt

    В папке с вашим кодом создаем файл с точно таким же именем requrements.txt Этим файлом мы говорим Docker, какие библиотеки нужно дополнительно установить и какой версии.

    Как понять, что туда написать?

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

    import os import requests from pandas import json_normalize import pandas as pd from datetime import datetime from datetime import * import httplib2 from oauth2client.service_account import ServiceAccountCredentials import apiclient.discovery

    В IDE в консоле пишем pip freeze.
    Видим список всех установленных пакетов в вашем виртуальном окружение и их версии

    Пример вывода списка библиотек с и их версии

    Выбираем библиотеки, которые мы с вами используем в коде и переносим в requrements.txt

    На выходе это будет выглядеть так:

    Наполнение файла requrements.txt

    Dockerfile

    заполненная структура докер файла

    Создаем файл Dockerfile, без расширения. Открываем его и заносим данные

    FROM python: «ваша версия python». Узнать ее можно набрав в терминале: python –V

    Подробно останавливаться на всем не буду. Выше собранный requrements.txt будет использован в RUN.

    ENV это переменное окружение, которые будут храниться внутри Docker. ENV TZ Europe/Moscow – установление московского времени.

    Все остальные переменные необходимы для корректной работы кода. (см. статью https://habr.com/ru/post/720862/)

    Конечно можно их и не прописывать и все оставить в коде. В моем случае, я решил, что оставлю все переменные в одном месте просто для своего удобства.

    CMD указываем язык программирования и названия вашего файла с кодом в моем случае это vk_stat.py

    Настраиваем переменное окружение в коде python

    Мы удаляем значение переменных из кода, так как они у нас уже в Dockerfile.
    Прописываем команду, которая будет забирать переменные окружения.

    TOKEN_USER = os.getenv('TOKEN_USER') VERSION = os.getenv('VERSION') DOMAIN = os.getenv('DOMAIN')

    Создаем сервер, публикуем код на GitHub

    Я бы посоветовал прежде, чем перейти к этому шагу скачать отдельно docker desktop и провести тестирование на вашей локальной машине.

    В этом видео вы найдете все что нужно по установки docker и кратко для чего он применяется. Мне данное видео очень помогло. https://www.youtube.com/watch?v=QF4ZF857m44

    Для тех кто c Docker знаком предлагаю просмотреть фрагмент видео (ссылка выше) с 1:05:23 по 1:10:17

    Добавлю лишь, если вы не хотите прописывать переменные внутри сервера, то сделайте закрытый репозиторий на GitHub!

    Здесь не вижу смысла перечислять все шаги, если вы повторите за автором видео.

    90% работы вами уже сделано. По итогам у вас:

    — Создан сервер с опубликованном кодом через github + установленный docker

    Отладка Cron

    Далее через командную строку заходим на наш сервер.

    Мне понравилась статья про cron здесь https://losst.pro/nastrojka-cron, но далее кратко напишу по сути. Набираем «crontab –e» в командной строке.

    В самом конце набираем интервал для запуска контейнер. В моем случае каждый час. В помощь хороший сайт, который позволит сразу настроить интервал https://crontab.guru

    Далее пишем команду Docker run –rm «имя вашего образа». Флажок –rm удаляет контейнер после его отработки. Не забываем сохранить наши изменения.

    Cron перед сохранением. test - имя моего образа

    Проверить, не падает ли контейнер при запуске можно в логах. Введите команду grep CRON /var/log/syslog

    Заключение

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

    Сервер обходиться в 200 рублей за месяц аренды. Работать код будет 4-6 месяцев. Если у кого-то есть решение, как можно сделать тоже самое без использования сервера, будет интересно почитать.

    Источник

    Читайте также:  Uploading and downloading html code
Оцените статью