我试图通过Windows任务计划程序设置重复的Python任务。
当我输入' python.exe'的路径时,我取得了成功。并将脚本的路径作为参数提供给windows任务调度程序(见下面的截图)
但是,我希望能够选择运行脚本的特定虚拟环境。我不太了解venv,我通常通过打开cmd并在所需的虚拟环境目录中运行Scripts \ activate.bat来使用它。
如何每24小时在venvxxx中完成运行任务x'使用Windows任务调度程序?
答案 0 :(得分:9)
使用以下命令创建批处理文件:
c:\__full_path_to_virtualenv__\Scripts\activate.bat && python __full_path_to_python_script__.py
&&表示如果 command1 成功完成,则运行 command2 。
然后将该批处理文件设置为要运行的脚本。您不需要在任务计划程序中设置任何其他参数(或者您可以在批处理文件中设置它们)并且如果脚本必须从特定目录读取/写入并使用,则可以设置开始相对路径。
答案 1 :(得分:3)
尽管上面mx0的答案似乎可行,但我已将Task Scheduler设置为在启动时运行Flask Web应用程序。在这种情况下,手动开始可以正常工作,但手动结束则不能。结束任务将终止设置虚拟环境的cmd.exe任务,但python.exe继续运行。
我发现有效的解决方案来自this reddit post,它跳过了虚拟环境的激活,直接调用python可执行文件:
path\to\venv\Scripts\python.exe path\to\script.py
我不确定它的鲁棒性如何,但是至少以这种方式结束任务会结束python.exe
答案 2 :(得分:2)
这比较冗长,但很容易理解,而且-我发现最重要的-与在拥有大量脚本的情况下使用Windows Task Scheduler设置相比要容易得多。要创建另一个文件,只需复制.bat文件并更改一行。
将其另存为.bat文件,并指向Actions > Start a Program > Program/Script:
下的文件,而无需添加参数或“开始于”。
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 <arg1> <arg2>
call %venv_root_dir%\Scripts\deactivate.bat
cd %original_dir%
exit /B 1
对于已安装的命令行程序,可以将python your_script.py <arg1> <arg2> ...
替换为<program name> <arg1> <arg2> ...
。
此外,很容易在下一行添加另一个脚本,而不是尝试将顺序脚本解析为Task Scheduler的单行代码。
答案 3 :(得分:0)
我尝试了mx0的答案,只要您的脚本不需要花费很多时间就可以了。
我在任务计划程序中使用了另一种方法,而不是使用批处理文件:
在“程序/脚本”文本框中,设置Python可执行文件的路径(在我的情况下位于virtualenv文件夹内)。
“添加参数” =仅是您的Python脚本的名称。
“开始于” = Python脚本的完整路径(无name.py)。
通过这种方式运行脚本,直到结束。
答案 4 :(得分:0)
我的解决方案几乎与mx0相同,但是我添加了一个额外的步骤来确保每次环境参数。编辑path/to/app
变量的app_path
。
每次检查环境设置可能有点多余,但是我喜欢确保已设置环境。
只需安排execute_app.bat
文件或在cmd提示符下运行。除非从Anaconda提示符运行,否则不需要停用命令。如果您为path/to/app
使用完整路径,则可以从任何目录执行此文件。我也有一个Linux解决方案,使用以下来自终端的execute_app.sh
文件。
此答案经过编辑以简化操作,并使用变量使其更易于适应新项目。
应用程序结构:
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
答案 5 :(得分:0)
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
从 github 上的 nmpowell 复制了这个,它工作正常。从任务调度程序运行