我正在尝试通过 Windows 任务调度程序设置一个重复的 Python 任务。
当我输入“python.exe”的路径并将脚本的路径作为参数提供给 Windows 任务调度程序时,我取得了成功(见下面的截图)
但是,我希望能够选择运行脚本的特定虚拟环境。我对 venv 了解不多,我通常通过打开 cmd 并在所需的虚拟环境目录中运行 Scripts\activate.bat 来使用它。
如何使用 Windows 任务调度程序完成“每 24 小时在 venvxxx 中运行任务 x”?
我正在尝试通过 Windows 任务调度程序设置一个重复的 Python 任务。
当我输入“python.exe”的路径并将脚本的路径作为参数提供给 Windows 任务调度程序时,我取得了成功(见下面的截图)
但是,我希望能够选择运行脚本的特定虚拟环境。我对 venv 了解不多,我通常通过打开 cmd 并在所需的虚拟环境目录中运行 Scripts\activate.bat 来使用它。
如何使用 Windows 任务调度程序完成“每 24 小时在 venvxxx 中运行任务 x”?
使用以下命令创建批处理文件:
c:\__full_path_to_virtualenv__\Scripts\activate.bat && python __full_path_to_python_script__.py
&&表示如果command1成功完成运行command2 。
然后将该批处理文件设置为要运行的脚本。您不需要在任务计划程序中设置任何其他参数(或者您可以在批处理文件中设置它们)并且如果脚本必须从特定目录读取/写入并使用相对路径,则可以设置Start in 。
虽然上面 mx0 的答案似乎有效,但我已经设置了任务计划程序以在启动时运行烧瓶网络应用程序。在这种情况下,手动启动可以正常工作,但手动结束则不行。结束任务会杀死设置虚拟环境的 cmd.exe 任务,但 python.exe 会继续运行。
我发现有效的解决方案来自这个 reddit 帖子,它跳过虚拟环境激活直接调用 python 可执行文件:
path\to\venv\Scripts\python.exe path\to\script.py
我不确定这会有多强大,但至少以这种方式结束任务将结束 python.exe
这更冗长但很容易理解,而且——我发现最重要的一点——比在有大量脚本时使用 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> ...
.
此外,在下一行添加另一个脚本很简单,而不是尝试将顺序脚本解析为任务计划程序的单行。
我的解决方案几乎与 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
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 复制它,它工作正常。从任务调度程序运行
创建 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.exe
arguments
start in
这也适用于 conda3 中的女服务员运行的烧瓶脚本。