使用annaconda env运行crontab作业

sto*_*elj 22 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
Run Code Online (Sandbox Code Playgroud)

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

$ sh scripts/my_script.bash
scripts/my_script.bash: 9: scripts/my_script.bash: source: not found
Run Code Online (Sandbox Code Playgroud)

我需要做些什么来确保激活适当的环境.可以向我解释,就像我5岁.

Eri*_*ger 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. 通过从cron运行bash脚本来解决conda先激活.

  • 某些包可能会注册要在激活时运行的脚本.激活还会设置某些包可能依赖的环境变量.因此,您应该始终使用`source activate`激活您的env.在使用诸如`proj4`或`cartopy`之类的包时,这个答案可能会引起问题. (3认同)
  • 在 cron 作业中,您应该使用 `source activate`(或者在新的 4.4 版本中使用 `conda activate`)。这将设置路径并立即运行激活脚本。 (2认同)

Jea*_*net 12

经过大量的摆弄之后,我必须crontab激活我的 conda 环境conda activate my_env并在该环境中运行 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 <<<
Run Code Online (Sandbox Code Playgroud)
  • /opt/anaconda3/要被正确引用替换的路径:通常是/home/USERNAME/anaconda3/.

问题

采购~/.bashrccrontab -e行不通的(至少在 Ubuntu 上不行)。

解释:

  • 在 Ubuntu 上,~/.bashrc文件开头有以下(或类似的)行:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Run Code Online (Sandbox Code Playgroud)
  • 这意味着,如果我们尝试在 中获取~/.bashrc文件crontab,则文件的其余部分.bashrc将不会执行,因为crontab不是以交互方式运行的(请参阅有关此主题的另一篇文章)。这意味着即使我们 source ,conda上面提到的代码片段也永远不会被执行。crontab~/.bashrc

_________ 工作解决方案 _________

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

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

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

确保这件事:

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

2. 在crontab -e插入 2 行中运行bash而不是sh~/.bashrc_conda

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

SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
Run Code Online (Sandbox Code Playgroud)

解释:

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

  • BASH_ENV=~/.bashrc_conda获取condabash运行的代码段chrontab。见帖子帖子

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

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

30 12 * * * conda activate my_env; python /path/to/script.py
Run Code Online (Sandbox Code Playgroud)

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

_______________

而且,它的工作。

有什么缺点吗?

如果 中的conda片段.bashrc被更新conda更新,它当然不会反映在单独的.bashrc_conda文件中。人们可能需要不时检查更新。

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


Jér*_*ôme 9

别打电话sh但是bash.source是一个bash命令.

- sh scripts/my_script.bash
+ bash scripts/my_script.bash
Run Code Online (Sandbox Code Playgroud)

要不就

chmod +x scripts/my_script.bash
./scripts/my_script.bash
Run Code Online (Sandbox Code Playgroud)

既然你添加了bash shebang.

  • 弄清楚了。在我的bash脚本中,我运行`source / home / ubuntu / miniconda3 / bin / activate`,然后`conda activate my_env`,而不是原始脚本中的`source activate my_env`。 (2认同)

You*_*Kim 5

就我而言,当我运行这行 shell 脚本时出现了这个错误: source activate my_env

activate: No such file or directory

所以我改变了source activate my_envsource /path/to/conda/bin/activate my_env。然后它开始工作。