【问题标题】:Run a python script in virtual environment from windows task scheduler从 Windows 任务调度程序在虚拟环境中运行 python 脚本
【发布时间】:2016-04-09 22:00:29
【问题描述】:

我正在尝试通过 Windows 任务调度程序设置循环 Python 任务。

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

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

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

【问题讨论】:

    标签: python-3.x windows-task-scheduler python-venv


    【解决方案1】:

    使用这些命令创建批处理文件:

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

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

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

    【讨论】:

    • 或通过任务计划程序将程序设置为“cmd”。和参数:“/C c:__full_path..
    • 对我来说这会运行两个脚本,但它不会在环境中运行 python 脚本
    • 什么意思,创建一个批处理文件?
    • 谢谢。执行完成后如何从同一个脚本中停用环境?
    • @NivCohen 你没有,没有必要这样做。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 如果你需要像subprocess.run()这样在脚本中运行python脚本,你还需要指向相同的python路径。
    【解决方案3】:

    这更冗长但很容易理解,而且 - 我发现最重要的 - 比在有大量脚本时使用 Windows 任务计划程序设置要容易得多。要创建另一个,您只需复制 .bat 文件并更改一行。

    将其保存为 .bat 文件并在 Actions > Start a Program > Program/Script: 下指向它,无需任何参数或“Start in”。

    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 &lt;arg1&gt; &lt;arg2&gt; ... 替换为&lt;program name&gt; &lt;arg1&gt; &lt;arg2&gt; ...

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      “Start in” => Python 脚本的完整路径(不带 name.py)。

      这样脚本就会运行,一直等到结束。

      【讨论】:

        【解决方案5】:

        我的解决方案几乎与 mx0 相同,但我添加了一个额外的步骤来确保每次都提供环境参数。为app_path 变量编辑path/to/app

        每次检查环境设置可能有点多余,但我喜欢确保设置我的环境。

        只需安排 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
        

        【讨论】:

        • 当然,我突然想到 setup_venv.py 文件中的所有 os 命令都可以添加到 .bat 文件中,而不是从 .bat 文件中运行 setup_venv.py 。跨度>
        【解决方案6】:
        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 复制了这个,它工作正常。从任务调度器运行

        【讨论】:

          【解决方案7】:

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

          在主脚本的最开始导入这个模块。 将task scheduler 中的program 设置为... conda path...\python.exe,将arguments 设置为您的py 脚本文件名,将start in 设置为您的py 脚本文件夹。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-08-06
            • 1970-01-01
            • 1970-01-01
            • 2022-11-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多