使用 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/bin
python /home/dev/AUTOSIFT/script.sh
不太明白你的问题。 script.sh 不是 python 脚本。这是一个 cron 工作吗?也许你需要先做一个 conda install pandas。
一个shell命令触发一个python脚本。不过我想通了。问题是 .sh 在运行时需要设置 PATH 变量。
某些包可能会注册脚本以在激活时运行。激活还设置一些包可能依赖的环境变量。因此,您应该始终使用source activate
激活您的环境。在使用 proj4
或 cartopy
等软件包时,遵循此答案可能会导致问题。
在 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 附加了以下 conda
sn-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_conda
将conda
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
,而是bash
。 source
是一个 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_env
比source 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 脚本