Python 使用anaconda env运行crontab作业
我想让cron作业使用已经存在的名为my_env的anaconda python环境执行python脚本。我能想到的唯一一件事是让cron作业运行一个名为Python 使用anaconda env运行crontab作业,python,bash,cron,anaconda,conda,canopy,miniconda,Python,Bash,Cron,Anaconda,Conda,Canopy,Miniconda,我想让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:
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岁一样向我解释。不要叫
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之后。我最近从Anaconda切换到Anaconda,正是为了避免在cron jobs中激活env。
基于PATH环境变量,Anaconda使这一点非常简单。(我使用的不是完整的Anaconds安装,但我相信anaconda应该以同样的方式工作)
有两种不同的方法,我已经测试过了
- 在python脚本main.py中添加一个shebang
#/home/users/user\u name/miniconda2/envs/my\u env/bin/python
- 将路径添加到crontab的顶部
PATH=/home/users/user\u name/miniconda2/envs/my\u env/bin
杰罗姆的回答和卡里克的评论都是正确的。我刚刚在一个需要
pynco,
的Conda env中使用上述方法,这需要完整的Conda环境来找到合适的nco
命令,例如ncks,ncrcat。
通过从cron运行bash脚本来解决,该脚本首先调用Conda activate。在我的例子中,我在运行这行shell脚本时遇到了这个错误:source activate my_env
激活:没有这样的文件或目录
因此,我将
source激活我的_env
更改为source/path/to/conda/bin/activate my_env
。然后它开始工作。经过多次修改后,我让crontab
用conda激活我的_env
激活我的conda环境,并在该环境中运行Python解释器
注意,我使用的是Ubuntu 18.04
背景
- 当Anaconda安装程序初始化conda时,它会在
文件的末尾追加一个代码段。每次用户以交互方式打开~/.bashrc
时,都会执行此文件。该代码段允许用户从bash
运行bash
命令(即conda
)conda激活我的_env
- Anaconda installer v2020.02在
中添加了以下~/.bashrc
代码片段:conda
SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
- 这意味着,如果我们试图在
中获取crontab
文件的源代码,则~/.bashrc
文件的其余部分将不会执行,因为.bashrc
没有交互运行(请参见另一个)这意味着上面提到的crontab
代码段永远不会被conda
执行,即使我们是crontab
~/.bashrc
conda
片段复制到一个单独的文件中
1。将conda
片段从~/.bashrc
复制到~/.bashrc\u conda
将上述代码段复制到另一个文件,例如~/.bashrc\u conda
确保:
- 运行cronjob的用户具有读取此文件的权限
- 其他用户无法写入此文件(安全风险)
crontab-e
中插入两行代码以运行bash
而不是sh
,并插入源代码~/.bashrc_conda
运行crontab-e
并在cronjob之前添加以下两行:
SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
说明:
意味着SHELL=/bin/bash
将通过crontab
而不是bash
(默认)运行cronjobssh
将BASH_ENV=~/.bashrc_conda
代码段发送到conda
运行的BASH
。见和chrontab
crontab-e
中插入cronjob行conda激活我的环境代码>在所需的.py
脚本执行之前
在所需conda环境中,每天中午12:30执行的脚本条目示例:
30 12 * * * conda activate my_env; python /path/to/script.py
注意conda激活我的环境运行Python解释器的命令之前的代码>
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
瞧,成功了。
有什么缺点吗?
如果.bashrc
中的conda
代码段被conda
更新,它当然不会反映在单独的.bashrc\u conda
文件中。您可能需要不时检查更新
还可以添加;conda在cronjob结束时停用,但这可能是多余的。我在Ubuntu 16中实现了您的解决方案,并成功地让Anaconda运行。然而,当尝试在运行的python脚本中导入PANDAS包时,我得到一个[Errno 2]没有这样的文件或目录。有没有想过为什么?我的bash命令设置非常简单PATH=/home/dev/anaconda3/bin
python/home/dev/AUTOSIFT/script.sh
我真的不明白你的问题。sh不是python脚本。这是cron的工作吗?也许你需要先做一个conda安装程序,shell命令会触发一个python脚本。不过我还是弄明白了。问题是.sh在运行时需要设置一个PATH变量。一些包可能会注册脚本以在激活时运行。激活还设置一些包可能依赖的环境变量。因此,您应该始终使用source activate
激活您的环境。在回答这个问题之后,我可以
30 12 * * * conda activate my_env; python /path/to/script.py