从Windows任务调度程序在虚拟环境中运行python脚本

des*_*uho 13 windows-task-scheduler python-3.x python-venv

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

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

Windows任务调度程序

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

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

mx0*_*mx0 14

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

c:\__full_path_to_virtualenv__\Scripts\activate.bat && python __full_path_to_python_script__.py
Run Code Online (Sandbox Code Playgroud)

&&表示如果 command1成功完成,则运行 command2.

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

  • 对我来说,这会运行两个脚本,但它不会在环境中运行 python 脚本 (4认同)

小智 7

这更冗长但很容易理解,而且 - 我发现最重要的 - 当你有很多脚本时,比使用 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
Run Code Online (Sandbox Code Playgroud)

对于已安装的命令行程序,您可以替换python your_script.py <arg1> <arg2> ...为<program name> <arg1> <arg2> ....

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


小智 5

尽管上述mx0的答案似乎可行,但我已将Task Scheduler设置为在启动时运行flask Web应用程序。在这种情况下,手动开始可以正常工作,但手动结束则不能。结束任务将终止设置虚拟环境的cmd.exe任务,但python.exe继续运行。

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

path\to\venv\Scripts\python.exe path\to\script.py
Run Code Online (Sandbox Code Playgroud)

我不确定它的鲁棒性如何,但是至少以这种方式结束任务会结束python.exe