使用anaconda env运行crontab作业

时间:2016-04-01 21:02:41

标签: python bash cron anaconda conda

我想让一个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岁。

4 个答案:

答案 0 :(得分:20)

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

有两种不同的方法,我已经测试过了;

  • 在你的python脚本main.py

    中添加一个shebang

    #!/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的评论是正确的。我刚刚在Conda env中使用上述方法进行了刻录,需要pynco,需要完整的conda环境才能找到nco命令,例如ncks, ncrcat.通过运行bash脚本来解决首先调用conda激活的cron。

答案 1 :(得分:5)

请勿拨打shbashsource是一个bash命令。

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

或者只是

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

因为你添加了bash shebang。

答案 2 :(得分:4)

摆弄了几句之后,我用crontab激活了conda activate my_env来激活我的conda环境并在该环境中运行Python解释器。

请注意,我正在使用Ubuntu 18.04。

背景

  • Anaconda安装程序初始化conda时,会在~/.bashrc文件的末尾附加一个代码段。每次用户以交互方式打开bash时都会执行此文件。该代码段允许用户从conda运行conda activate my_env命令(即bash)。

  • Anaconda安装程序v2020.02在conda 中附加了以下 ~/.bashrc片段:

# >>> 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/

问题

~/.bashrc中采购crontab -e无效(至少在Ubuntu上无效)。

说明:

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

_________工作解决方案_________

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

1。将conda片段从~/.bashrc复制到~/.bashrc_conda

将上述代码段复制到另一个文件,例如~/.bashrc_conda

确保:

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

2。在crontab -e中插入2行以运行bash而不是sh并获取~/.bashrc_conda

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

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

说明:

  • SHELL=/bin/bash意味着crontab将通过bash而不是sh(默认值)运行cronjobs。 See post

  • BASH_ENV=~/.bashrc_condaconda片段源到bash运行的chrontab。参见postpost

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

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

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

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

_______________

voilà,它有效。

有什么缺点吗?

如果conda中的.bashrc代码段已通过conda更新进行了更新,则它当然不会反映在单独的.bashrc_conda文件中。可能需要不时检查更新。

也可以在该cronjob的处附加; conda deactivate,但这可能是多余的。

答案 3 :(得分:0)

在我的情况下,运行以下命令行脚本时出现此错误:source activate my_env

activate: No such file or directory

因此,我将source activate my_env更改为source /path/to/conda/bin/activate my_env。然后它开始工作。