Запуск скрипта python через планировщик windows

Запуск Python скрипта через планировщик Windows

В одной из записей блога я писал как можно автоматизировать выполнение скрипта при помощи cron и linux. Тогда речь шла о WSL (подсистема Linux для Windows). К сожалению с производительностью у WSL пока не все гладко, поэтому пришлось все портировать на Windows.

Сам вопрос запуска скрипта по расписанию в Windows на самом деле очень прост. Нужно лишь создать батник (файл с расширением .bat) прописать в нем все необходимые манипуляции и настроить выполнение данного файла в планировщике. Делается это так:

  • В текстовом редакторе создаете новый файл
  • Добавляете в него ваш код, в моем случае это одна строчка
    C:\Users\User\.virtualenvs\site-GQljvJBG\Scripts\python.exe «D:/dev/site/backend/cron.py»
  • Сохраняете файл с расширением .bat, например cron.bat.
  • В планировщике прописываете его выполнение

Особенности запуска Django кода

Если вы пропишите запуск какого нибудь Django скрипта то получите ошибку.

django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings

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

import os import django<br>os.environ["DJANGO_SETTINGS_MODULE"] = 'project.settings' django.setup()

Где ‘project.settings’ путь к файлу settings.py вашего Джанго проекта.

Источник

Запуск python-скрипта в Windows по расписанию

Как настроить запуск python-скрипта в Windows по расписанию?

Прежде всего необходимо создать файл с расширением bat.
В этом файле написать следующий код:

C:\Users\user\PycharmProjects\venv\Scripts\python.exe C:\Users\user\PycharmProjects\avtozapusk\citaty.py pause

Где мы сначала указываем путь, где находится python, далее путь к скрипту, который хотим запускать.
Следующая строка — это команда pause — остановка командной строки.
После этого идем в Планировщик заданий, в который можно попасть через Пуск.

В Планировщике заданий наводим мышкой на Библиотеку планировщика и кликаем правой кнопкой мыши, чтобы появилось меню. Там выбираем пункт: Создать простую задачу…

В появившемся окне зададим имя скрипту, а также, если есть желание, описание. После чего кликаем на кнопку Далее.

В следующем окне выберем как часто хотим запускать наш скрипт, в нашем случае выберем ежедневно. И вновь жамкаем на кнопку Далее.

На следующем шаге укажем время, в которое хотим запускать наш python-скрипт.

Выберем какую задачу хотим выполнить, в нашем примере — это Запустить программу.

В следующем окне укажем, расположение созданного нами файл с расширением .bat.

И в последнем окне кликаем на кнопку «Готово!»

На этом все. Если возникнуть сложности или остались вопросы — пишите в комментариях.

Источник

Run a python script in virtual environment from windows task scheduler

windows task scheduler

I’m trying to set up a recurring Python task through windows task scheduler. I have had success when I input the path to ‘python.exe’ and provide the script’s path as a parameter to windows task scheduler (see screenshot below) However, I want to be able to choose a particular virtual environment in which to run the script. I don’t have much knowledge of venv, and I typically use it by opening cmd and running Scripts\activate.bat in the desired virtual environment directory. How can I accomplish ‘run task x in venvxxx every 24 hours’ using windows task scheduler?

9 Answers 9

Create batch file with these commands:

c:\__full_path_to_virtualenv__\Scripts\activate.bat && python __full_path_to_python_script__.py 

&& means run command2 if command1 completed successfully.

Then set that batch file as script to run. You don’t need to set any additional arguments in task scheduler (or you can set them in batch file anyway) and can set Start in if script has to read/write from specific directory and uses relative paths.

@JohnAndrews it means create a new text file with the .bat extension and write your code in it. eg. run.bat

Though the answer by mx0 above seems to work, I have set up Task Scheduler to run a flask web app on bootup. In this case, manual starting works fine, but manual ending does not. Ending the task kills the cmd.exe task that sets up the virtual environment, but the python.exe continues to run.

The solution that I found worked was from this reddit post which skips the virtual environment activation to call the python executable directly:

path\to\venv\Scripts\python.exe path\to\script.py 

I’m not sure how robust this will be, but at least this way ending the task will end the python.exe

If you need to run python scripts from within the script like subprocess.run() You also need to point to the same python path.

This is more verbose but very easy to understand, and — I found the most important — much easier than using Windows Task Scheduler settings when you have lots of scripts. To create another you just copy the .bat file and change one line.

Save this as a .bat file and point to it under Actions > Start a Program > Program/Script: , with no arguments or «Start in» necessary.

set original_dir=%CD% set venv_root_dir="C:\Python-Venvs\env-name" cd %venv_root_dir% call %venv_root_dir%\Scripts\activate.bat python your_script.py  call %venv_root_dir%\Scripts\deactivate.bat cd %original_dir% exit /B 1 

For an installed command-line program, you can replace python your_script.py . with . .

In addition it’s simple to add another script on the following line, rather than attempting to parse sequential scripts into a one-liner for Task Scheduler.

I tried with mx0’s answer and it works fine as long as your script does not take too long to finish.

I use a different approach in the task scheduler instead using batch files:

In «Program/script» textbox you set the path to Python executable (in my case is inside the virtualenv folder).

«Add arguments» => Just the name of your Python script (name.ppy).

«Start in» => The full path of your Python script (without the name.py).

This way the script runs and wait until the end.

enter image description here

My solution is almost identical to mx0, but I’ve added an extra step to ensure environment parameters each time. Edit the path/to/app for the app_path variable.

It may be a little redundant to check the environment setup every time, but I like ensuring my environment is set.

Simply schedule the execute_app.bat file or run in the cmd prompt. Deactivate command is not needed unless running from an Anaconda prompt. If you use a full path for path/to/app this file can be executed from any directory. I also have a Linux solution using execute_app.sh file below from a terminal.

This answer has been edited to simplify, and to use variables to make this easier to adapt to new projects.

App structure:
app/bin/app.py
app/bin/execute_app.bat
app/env/requirements.txt

# execute_app.bat file # windows solution SETLOCAL set app_path=path/to/app set env_path=%app_path%/env set activ=%env_path%/Scripts/activate.bat set req=%env_path%/requirements.txt set app=%app_path%/bin/app.py py -m venv %env_path% && %activ% && python -m pip install --upgrade pip && pip install -r %req% && python %app% ENDLOCAL 
#!/bin/bash # execute_app.sh file # Linux solution app_path='path/to/app' env_path=$app_path'/env' activ=$env_path'/bin/activate' req=$env_path'/requirements.txt' app=$app_path'/bin/app.py' python3 -m venv $env_path && . $activ && python3 -m pip install --upgrade pip && pip install -r $req && python $app && deactivate 

Of course, it just occurred to me that all of the os commands in the setup_venv.py file could be added to the .bat file instead of running setup_venv.py from the .bat file.

The selected answer for this question is not correct. If you review the comments, you’ll see the problem.

My answer builds off of @Nick P’s answer (the #2 answer currently). His batch file will work, but you’ll want to change the exit code from 1 to 0 if you want Windows Task Scheduler to report the task completed successfully. Also, simply calling the .bat file on the «Program/Script» line will not work. Instead, you need to put the name of your shell as the «Program/Script» to run (for instance, cmd), then put «/c name-of-batch-file.bat» goes in the «Add arguments (optional):» field. And finally, put the path to the batch file (minus the file name) in the «Start in (optional):» field.

screenshot of windows task scheduler Edit Action form

It should look something like this:

REM Windows batch script to run 1+ Python program/scripts, sequentially, within REM their virtual environment. This can be called from Windows Task Scheduler. set original_dir=%CD% set venv_root_dir="C:\Users\myUsername\myProjects\nameOfProject" cd %venv_root_dir% call %venv_root_dir%\Scripts\activate.bat python nameOfPythonProgram.py call %venv_root_dir%\Scripts\deactivate.bat cd %original_dir% exit /B 1 

Copied this from nmpowell on github and it works fine. Run from task scheduler

Patching the path is all necessary. The quick way would be a bat script that source environment activation script at the beginning

@call PATH_TO_MY_VENV/bin/activate.bat python app.py 

Proceeding Problem

Later you will realize that the python job starts fine, but won’t stop when Windows Scheduler stop it.

When taskengine.exe decides to stop the job, the intermediate cmd.exe (bat script) process is killed and the Python.exe will be left straw. since the cmd.exe(bat script) won’t signal python.exe to stop on exit.

Final Solution

Let Windows Task Scheduler or taskengine.exe launch python.exe directly without a middle-man script. Previous answers launch python.exe directly with py script, this works for simple modules, but not for some binary module in conda environment.

For binary modules in conda to work, you can create a utility module named e.g. patch_conda_path to patch PATH variable in os.environ based on sys.base_exec_prefix. Copy the patching work that activate.bat does, just in python. below example has been tested for conda virtual environment:

import is, sys conda_base = sys.base_exec_prefix subps = [";", "library\\mingw-w64\\bin;", "library\\usr\\bin;", "library\\bin;", "scripts;", "bin;", "condabin;"] conda_paths = "" for p in subps : _p = os.path.join(conda_base, p) if _p in os.environ["PATH"]: continue else: conda_paths += _p os.environ["PATH'"] = conda_paths + os.environ["PATH"] 

Import this module at the beginning of your main script.

import patch_conda_path . original main script . 
  • program to . conda environment path. \python.exe ,
  • arguments to your py script file name and
  • start in to your py script folder.

Источник

Читайте также:  Html table with color header
Оцените статью