24

我正在尝试通过 Windows 任务调度程序设置一个重复的 Python 任务。

当我输入“python.exe”的路径并将脚本的路径作为参数提供给 Windows 任务调度程序时,我取得了成功(见下面的截图)

windows任务调度器

但是,我希望能够选择运行脚本的特定虚拟环境。我对 venv 了解不多,我通常通过打开 cmd 并在所需的虚拟环境目录中运行 Scripts\activate.bat 来使用它。

如何使用 Windows 任务调度程序完成“每 24 小时在 venvxxx 中运行任务 x”?

4

7 回答 7

26

使用以下命令创建批处理文件:

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

&&表示如果command1成功完成运行command2 。

然后将该批处理文件设置为要运行的脚本。您不需要在任务计划程序中设置任何其他参数(或者您可以在批处理文件中设置它们)并且如果脚本必须从特定目录读取/写入并使用相对路径,则可以设置Start in 。

于 2017-05-15T20:22:07.880 回答
8

虽然上面 mx0 的答案似乎有效,但我已经设置了任务计划程序以在启动时运行烧瓶网络应用程序。在这种情况下,手动启动可以正常工作,但手动结束则不行。结束任务会杀死设置虚拟环境的 cmd.exe 任务,但 python.exe 会继续运行。

我发现有效的解决方案来自这个 reddit 帖子,它跳过虚拟环境激活直接调用 python 可执行文件:

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

我不确定这会有多强大,但至少以这种方式结束任务将结束 python.exe

于 2018-08-09T20:16:10.037 回答
8

这更冗长但很容易理解,而且——我发现最重要的一点——比在有大量脚本时使用 Windows 任务计划程序设置要容易得多。要创建另一个,您只需复制 .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> ....

此外,在下一行添加另一个脚本很简单,而不是尝试将顺序脚本解析为任务计划程序的单行。

于 2019-01-21T14:25:28.897 回答
1

我尝试使用 mx0 的答案,只要您的脚本不需要太长时间即可完成,它就可以正常工作。

我在任务计划程序中使用了不同的方法,而不是使用批处理文件:

在“程序/脚本”文本框中,您设置 Python 可执行文件的路径(在我的情况下是在 virtualenv 文件夹内)。

“添加参数” => 只是 Python 脚本的名称(name.ppy)。

"Start in" => Python 脚本的完整路径(没有name.py)。

这样脚本运行并等到结束。

在此处输入图像描述

于 2019-11-27T22:38:57.573 回答
1

我的解决方案几乎与 mx0 相同,但我添加了一个额外的步骤来确保每次都提供环境参数。编辑变量path/to/appapp_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
于 2020-06-03T18:27:44.980 回答
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 复制它,它工作正常。从任务调度程序运行

于 2021-07-30T13:03:57.100 回答
0

创建 bat 文件以启动 Python 脚本在启动进程时有效,但在停止时无效。当 taskengine.exe 决定停止作业时,bat 进程将被终止,Python.exe 将被丢弃。

恕我直言,最好的方法是创建一个实用程序模块,例如patch_conda_path 基于 sys.base_exec_prefix 修补 os.environ 中的 PATH。
例如

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"]

在主脚本的最开始导入此模块。设置program为,task scheduler到你的 py 脚本文件名和你的 py 脚本文件夹。... conda path...\python.exeargumentsstart in

这也适用于 conda3 中的女服务员运行的烧瓶脚本。

于 2021-11-24T07:42:21.897 回答