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使这非常简单.(我使用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. 通过从cron运行bash脚本来解决conda先激活.
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/.问题
采购~/.bashrc是crontab -e行不通的(至少在 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代码片段复制到一个单独的文件中。
conda代码片段从复制~/.bashrc到~/.bashrc_conda将上面提到的代码片段复制到另一个文件中,例如~/.bashrc_conda.
确保这件事:
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 。见帖子。
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的末尾附加,但这可能是多余的。
别打电话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.
就我而言,当我运行这行 shell 脚本时出现了这个错误: source activate my_env
activate: No such file or directory
所以我改变了source activate my_env对source /path/to/conda/bin/activate my_env。然后它开始工作。