使用 anaconda 环境运行 crontab 作业

Posted

技术标签:

【中文标题】使用 anaconda 环境运行 crontab 作业【英文标题】:run a crontab job using an anaconda env 【发布时间】:2016-07-21 19:39:53 【问题描述】:

我想让一个 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 岁一样向我解释。

【问题讨论】:

【参考方案1】:

我最近从 canopy 切换到 Anaconda 正是为了避免在 cron 作业中激活环境。 Anaconda 基于 PATH 环境变量使这变得非常简单。 (我使用 miniconda 不是完整的 Anaconda 安装,但我相信 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 的 cmets 是正确的。我刚刚在需要 pynco, 的 Conda 环境中使用上述方法被烧毁,这需要完整的 conda 环境才能找到正确的 nco 命令,例如 ncks, ncrcat. 通过从 cron 运行 bash 脚本来解决,该脚本首先调用 conda activate .

【讨论】:

我在 Ubuntu 16 中实现了您的解决方案,并成功让 Anaconda 运行。但是,当尝试在运行的 python 脚本中导入 PANDAS 包时,我得到一个 [Errno 2] No such file or directory。关于为什么的任何想法?我的 bash 命令设置非常简单。 PATH=/home/dev/anaconda3/binpython /home/dev/AUTOSIFT/script.sh 不太明白你的问题。 script.sh 不是 python 脚本。这是一个 cron 工作吗?也许你需要先做一个 conda install pandas。 一个shell命令触发一个python脚本。不过我想通了。问题是 .sh 在运行时需要设置 PATH 变量。 某些包可能会注册脚本以在激活时运行。激活还设置一些包可能依赖的环境变量。因此,您应该始终使用source activate 激活您的环境。在使用 proj4cartopy 等软件包时,遵循此答案可能会导致问题。 在 cron 作业中,您应该 source activate(或在新的 4.4 版本中为 conda activate)。这将设置路径立即运行激活脚本。【参考方案2】:

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

注意我使用的是 Ubuntu 18.04。

背景

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

Anaconda 安装程序 v2020.02 附加了以下 condasn-p in ~/.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/

问题

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)。 这意味着上面提到的conda sn-p 永远不会被crontab 执行,即使我们获取~/.bashrc

_________ 工作解决方案 _________

我找到的解决方案是将conda sn-p 复制到一个单独的文件中。

1。将conda sn-p 从~/.bashrc 复制到~/.bashrc_conda

将上面提到的sn-p复制到另一个文件,例如~/.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(默认)运行cronjobs。 See post.

BASH_ENV=~/.bashrc_condaconda sn-p 发送到由chrontab 运行的bash。请参阅post 和post。

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 sn-p 通过conda 更新进行更新,它当然不会反映在单独的.bashrc_conda 文件中。可能需要不时检查更新。

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

【讨论】:

【参考方案3】:

不要打电话给sh,而是bashsource 是一个 bash 命令。

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

或者只是

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

自从你添加了 bash shebang。

【讨论】:

是否有更新,现在conda activate my_envsource activate my_env 更受欢迎?我遇到了麻烦... 我不使用 conda。我想你可以使用 sh 或 bash,那么。 想通了。在我的 bash 脚本中,我先运行 source /home/ubuntu/miniconda3/bin/activate,然后运行 ​​conda activate my_env,而不是原始脚本中的 source activate my_env【参考方案4】:

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

activate: No such file or directory

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

【讨论】:

这个解决方案是最简单的!谢谢~~~ 确保在使用source cmd 时使用bash(而不是sh)

以上是关于使用 anaconda 环境运行 crontab 作业的主要内容,如果未能解决你的问题,请参考以下文章

通过 Windows cmd 在 Anaconda 环境中运行 python 脚本

Crontab定时任务中python3脚本无法运行问题解决

crontab环境变量问题

在crontab中执行脚本重要事项

pip install dlib 在 Anaconda 环境中不起作用

text 在环境Anaconda上运行