经过一番折腾,我得到了crontab 来使用conda activate my_env 激活我的 conda 环境,并在该环境中运行 Python 解释器。
注意我使用的是 Ubuntu 18.04。
背景
# >>> 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
解释:
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,但这可能是多余的。