我想让一个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岁一样向我解释它是可以的。
7条答案
按热度按时间pgpifvop1#
我最近从canopy切换到Anaconda,正是为了避免在cron作业中激活env。Anaconda使这一点非常简单,基于PATH环境变量。(我使用的是miniconda,而不是完整的Anaconds安装,但我相信anaconda应该以同样的方式工作)
我测试过两种不同的方法
#!/home/users/user_name/miniconda2/envs/my_env/bin/python
PATH=/home/users/user_name/miniconda2/envs/my_env/bin
更新日期:
Jérôme的回答和cbarrick的评论都是正确的。我刚刚在一个需要
pynco,
的Conda环境中使用了上述方法,而pynco,
需要完整的Conda环境来找到正确的nco
命令,例如ncks, ncrcat.
。解决方法是从cron运行一个bash脚本,首先调用conda activate。mzmfm0qo2#
经过一番折腾,我得到了
crontab
来激活我的conda环境,并在该环境中运行Python解释器。注意我使用的是Ubuntu 18.04。
背景
~/.bashrc
文件的末尾附加一个代码段。用户每次交互式打开bash
时都会执行这个文件。该代码段允许用户从bash
运行conda
命令(即conda activate my_env
)。~/.bashrc
中附加了以下conda
代码段:/opt/anaconda3/
:通常为/home/USERNAME/anaconda3/
。*问题是
在
crontab -e
中获取~/.bashrc
是行不通的(至少在Ubuntu上行不通)。说明:
~/.bashrc
在文件开头有以下(或类似)行:crontab
中获取~/.bashrc
文件,则.bashrc
文件的其余部分将不会执行,因为crontab
未交互运行(请参阅另一个post on this topic)。这意味着,即使我们获取~/.bashrc
,crontab
也不会执行上面提到的conda
片段。工作溶液__
我找到的解决方案是将
conda
代码段复制到单独的文件中。1.将
conda
代码段从~/.bashrc
复制到~/.bashrc_conda
将上面提到的代码段复制到另一个文件,例如
~/.bashrc_conda
。确保:
2.在
crontab -e
中,插入2行以运行bash
(而不是sh
)并返回源~/.bashrc_conda
运行
crontab -e
并在cronjob之前添加以下2行:说明:
SHELL=/bin/bash
表示crontab
将通过bash
而不是sh
(默认)运行cronjob。See post。BASH_ENV=~/.bashrc_conda
将conda
代码段源代码提供给由chrontab
运行的bash
。3.在
crontab -e
中,在所需的.py
脚本执行之前插入cronjob行conda activate my_env;
在所需的conda环境中每天中午12:30执行的脚本条目示例:
注意运行Python解释器的命令前面的
conda activate my_env;
。______________
瞧,它成功了。
有什么缺点吗
如果
.bashrc
中的conda
片段被conda
更新所更新,它当然不会反映在单独的.bashrc_conda
文件中,用户可能需要不时地检查更新。也可以在cronjob的 end 处附加
; conda deactivate
,但这可能是多余的。vdgimpew3#
不要调用
sh
,而要调用bash
。source
是一个bash命令。或者只是
因为你加了狂欢节。
vcirk6k64#
在我的例子中,当我运行下面这行shell脚本时,我得到了这个错误:
source activate my_env
activate: No such file or directory
所以我把
source activate my_env
改成了source /path/to/conda/bin/activate my_env
。然后它就开始工作了。bbuxkriu5#
截至2022年5月,我只是在Windows 10中使用一个
.bat
来激活myenv
,然后启动我的localhost
或任何你需要的脚本:mhd8tkvw6#
使用conda的完整路径
对我来说,一个简单的解决方案是在crontab条目中指定conda的完整路径,并使用
conda run -n <env>
选项在所需的环境中执行命令。在我的例子中,我想在启动时启动一个命令,所以我的crontab条目如下所示:@reboot ~/miniconda3/bin/conda run -n <env> <command>
其中
<env>
和<command>
根据您自己的要求进行替换。ih99xse17#
在某些情况下,这种方法可能更简单、更简洁:
1.找到你的conda环境的路径
conda env list
1.在crontab文件顶部添加以下内容作为“PATH”:
PATH=/Users/your_user_name/opt/anaconda3/envs/your_env/bin
有关详细信息,请查看tutorial(源代码)