python 使用anaconda环境运行crontab作业

mwg9r5ms  于 2023-03-11  发布在  Python
关注(0)|答案(7)|浏览(265)

我想让一个cron作业使用一个已经存在的名为my_env的anaconda python环境来执行python脚本,我能想到的唯一方法是让cron作业运行一个名为my_script.bash的脚本,该脚本依次激活env,然后运行python脚本。

#!/bin/bash
source activate my_env
python ~/my_project/main.py

尝试从命令行执行此脚本不起作用:

$ sh scripts/my_script.bash
scripts/my_script.bash: 9: scripts/my_script.bash: source: not found

我需要做些什么来确保正确的环境被激活。就像我5岁一样向我解释它是可以的。

pgpifvop

pgpifvop1#

我最近从canopy切换到Anaconda,正是为了避免在cron作业中激活env。Anaconda使这一点非常简单,基于PATH环境变量。(我使用的是miniconda,而不是完整的Anaconds安装,但我相信anaconda应该以同样的方式工作)
我测试过两种不同的方法

  • 在python脚本中添加shebang,main.py

#!/home/users/user_name/miniconda2/envs/my_env/bin/python

  • 将PATH添加到crontab的顶部

PATH=/home/users/user_name/miniconda2/envs/my_env/bin

更新日期:

Jérôme的回答和cbarrick的评论都是正确的。我刚刚在一个需要pynco,的Conda环境中使用了上述方法,而pynco,需要完整的Conda环境来找到正确的nco命令,例如ncks, ncrcat.。解决方法是从cron运行一个bash脚本,首先调用conda activate。

mzmfm0qo

mzmfm0qo2#

经过一番折腾,我得到了crontab来激活我的conda环境,并在该环境中运行Python解释器。
注意我使用的是Ubuntu 18.04。

背景

  • 当Anaconda安装程序初始化conda时,它会在~/.bashrc文件的末尾附加一个代码段。用户每次交互式打开bash时都会执行这个文件。该代码段允许用户从bash运行conda命令(即conda activate my_env)。
  • Anaconda安装程序v2020.02在~/.bashrc中附加了以下conda代码段:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/opt/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<
    • 要替换为正确引用的路径/opt/anaconda3/:通常为/home/USERNAME/anaconda3/。*
      问题是

crontab -e中获取~/.bashrc是行不通的(至少在Ubuntu上行不通)。
说明:

  • 在Ubuntu上,~/.bashrc在文件开头有以下(或类似)行:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
  • 这意味着,如果我们尝试在crontab中获取~/.bashrc文件,则.bashrc文件的其余部分将不会执行,因为crontab未交互运行(请参阅另一个post on this topic)。这意味着,即使我们获取~/.bashrccrontab也不会执行上面提到的conda片段。

工作溶液__

我找到的解决方案是将conda代码段复制到单独的文件中。

1.将conda代码段从~/.bashrc复制到~/.bashrc_conda

将上面提到的代码段复制到另一个文件,例如~/.bashrc_conda
确保:

  • 运行cronjob的用户具有读取此文件的权限。
  • 其他用户无法写入此文件(安全风险)。

2.在crontab -e中,插入2行以运行bash(而不是sh)并返回源~/.bashrc_conda

运行crontab -e并在cronjob之前添加以下2行

SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda

说明:

  • SHELL=/bin/bash表示crontab将通过bash而不是sh(默认)运行cronjob。See post
  • BASH_ENV=~/.bashrc_condaconda代码段源代码提供给由chrontab运行的bash

3.在crontab -e中,在所需的.py脚本执行之前插入cronjob行conda activate my_env;

在所需的conda环境中每天中午12:30执行的脚本条目示例:

30 12 * * * conda activate my_env; python /path/to/script.py

注意运行Python解释器的命令前面的conda activate my_env;

______________

瞧,它成功了。

有什么缺点吗

如果.bashrc中的conda片段被conda更新所更新,它当然不会反映在单独的.bashrc_conda文件中,用户可能需要不时地检查更新。
也可以在cronjob的 end 处附加; conda deactivate,但这可能是多余的。

vdgimpew

vdgimpew3#

不要调用sh,而要调用bashsource是一个bash命令。

- sh scripts/my_script.bash
    + bash scripts/my_script.bash

或者只是

chmod +x scripts/my_script.bash
    ./scripts/my_script.bash

因为你加了狂欢节。

vcirk6k6

vcirk6k64#

在我的例子中,当我运行下面这行shell脚本时,我得到了这个错误:source activate my_env
activate: No such file or directory
所以我把source activate my_env改成了source /path/to/conda/bin/activate my_env。然后它就开始工作了。

bbuxkriu

bbuxkriu5#

截至2022年5月,我只是在Windows 10中使用一个.bat来激活myenv,然后启动我的localhost或任何你需要的脚本:

@echo off
set CONDAPATH=C:\Users\MyName\anaconda3
set ENVNAME=myenv
if %ENVNAME%==base (set ENVPATH=%CONDAPATH%) else (set ENVPATH=%CONDAPATH%\envs\%ENVNAME%)
call %CONDAPATH%\Scripts\activate.bat %ENVPATH%

call cd /d d:/mysite
python manage.py runserver 0.0.0.0:8000
mhd8tkvw

mhd8tkvw6#

使用conda的完整路径

对我来说,一个简单的解决方案是在crontab条目中指定conda的完整路径,并使用conda run -n <env>选项在所需的环境中执行命令。在我的例子中,我想在启动时启动一个命令,所以我的crontab条目如下所示:
@reboot ~/miniconda3/bin/conda run -n <env> <command>
其中<env><command>根据您自己的要求进行替换。

ih99xse1

ih99xse17#

在某些情况下,这种方法可能更简单、更简洁:
1.找到你的conda环境的路径
conda env list
1.在crontab文件顶部添加以下内容作为“PATH”:
PATH=/Users/your_user_name/opt/anaconda3/envs/your_env/bin
有关详细信息,请查看tutorial(源代码)

相关问题