我想让一个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岁。
答案 0 :(得分:20)
我最近从canopy切换到Anaconda正是为了避免在cron作业中激活env。 基于PATH环境变量,Anaconda使这非常简单。 (我使用miniconda而不是完整的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)
请勿拨打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。
答案 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上无效)。
说明:
~/.bashrc
在文件开头具有以下(或类似内容)行:# If not running interactively, don't do anything
[ -z "$PS1" ] && return
~/.bashrc
中的crontab
文件作为源文件,则.bashrc
文件的其余部分将不会执行,因为crontab
不是交互式运行的(请参阅另一个post on this topic)。 这意味着即使我们采购了conda
,上面提到的crontab
代码段也不会被~/.bashrc
执行。 我发现的解决方案是将conda
代码段复制到单独的文件中。
conda
片段从~/.bashrc
复制到~/.bashrc_conda
将上述代码段复制到另一个文件,例如~/.bashrc_conda
。
确保:
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_conda
将conda
片段源到bash
运行的chrontab
。参见post和post。
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;
。
如果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
。然后它开始工作。