Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用anaconda env运行crontab作业_Python_Bash_Cron_Anaconda_Conda_Canopy_Miniconda - Fatal编程技术网

Python 使用anaconda env运行crontab作业

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:

我想让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岁一样向我解释。

不要叫
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
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 我找到的解决方案是将
conda
片段复制到一个单独的文件中

1。将
conda
片段从
~/.bashrc
复制到
~/.bashrc\u conda
将上述代码段复制到另一个文件,例如
~/.bashrc\u conda

确保:

  • 运行cronjob的用户具有读取此文件的权限
  • 其他用户无法写入此文件(安全风险)
2。在
crontab-e
中插入两行代码以运行
bash
而不是
sh
,并插入源代码
~/.bashrc_conda
运行
crontab-e
并在cronjob之前添加以下两行

SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
说明:

  • SHELL=/bin/bash
    意味着
    crontab
    将通过
    bash
    而不是
    sh
    (默认)运行cronjobs

  • BASH_ENV=~/.bashrc_conda
    conda
    代码段发送到
    BASH
    运行的
    chrontab
    。见和

3。在
crontab-e
中插入cronjob行
conda激活我的环境在所需的
.py
脚本执行之前
在所需conda环境中,每天中午12:30执行的脚本条目示例:

30 12 * * * conda activate my_env; python /path/to/script.py
注意
conda激活我的环境

\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