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
。然后它开始工作。
归档时间: |
|
查看次数: |
9002 次 |
最近记录: |