【问题标题】:run a crontab job using an anaconda env使用 anaconda 环境运行 crontab 作业
【发布时间】:2016-07-21 19:39:53
【问题描述】:

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

【问题讨论】:

    标签: python bash cron anaconda conda


    【解决方案1】:

    我最近从 切换到 Anaconda 正是为了避免在 cron 作业中激活环境。 Anaconda 基于 PATH 环境变量使这变得非常简单。 (我使用 不是完整的 Anaconda 安装,但我相信 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 的 cmets 是正确的。我刚刚在需要 pynco, 的 Conda 环境中使用上述方法被烧毁,这需要完整的 conda 环境才能找到正确的 nco 命令,例如 ncks, ncrcat. 通过从 cron 运行 bash 脚本来解决,该脚本首先调用 conda activate .

    【讨论】:

    • 我在 Ubuntu 16 中实现了您的解决方案,并成功让 Anaconda 运行。但是,当尝试在运行的 python 脚本中导入 PANDAS 包时,我得到一个 [Errno 2] No such file or directory。关于为什么的任何想法?我的 bash 命令设置非常简单。 PATH=/home/dev/anaconda3/binpython /home/dev/AUTOSIFT/script.sh
    • 不太明白你的问题。 script.sh 不是 python 脚本。这是一个 cron 工作吗?也许你需要先做一个 conda install pandas。
    • 一个shell命令触发一个python脚本。不过我想通了。问题是 .sh 在运行时需要设置 PATH 变量。
    • 某些包可能会注册脚本以在激活时运行。激活还设置一些包可能依赖的环境变量。因此,您应该始终使用source activate 激活您的环境。在使用 proj4cartopy 等软件包时,遵循此答案可能会导致问题。
    • 在 cron 作业中,您应该 source activate(或在新的 4.4 版本中为 conda activate)。这将设置路径立即运行激活脚本。
    【解决方案2】:

    经过一番折腾,我得到了crontab 来使用conda activate my_env 激活我的 conda 环境,并在该环境中运行 Python 解释器。

    注意我使用的是 Ubuntu 18.04。

    背景

    • 当 Anaconda 安装程序初始化 conda 时,它会在 ~/.bashrc 文件的末尾附加一个 sn-p。每次用户以交互方式打开bash 时都会执行此文件。 sn-p 允许用户从bash 运行conda 命令(即conda activate my_env)。

    • Anaconda 安装程序 v2020.02 附加了以下 condasn-p in ~/.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 <<<
    
    • 路径/opt/anaconda3/ 被替换为正确的引用:通常是/home/USERNAME/anaconda3/

    问题

    crontab -e 中采购~/.bashrc 将不起作用(至少在 Ubuntu 上不起作用)。

    解释:

    • 在 Ubuntu 上,~/.bashrc 在文件开头有以下(或类似的)行:
    # If not running interactively, don't do anything
    [ -z "$PS1" ] && return
    
    • 这意味着如果我们尝试在crontab 中获取~/.bashrc 文件,则.bashrc 文件的其余部分将不会执行,因为crontab 没有以交互方式运行(参见另一个post on this topic)。 这意味着上面提到的conda sn-p 永远不会被crontab 执行,即使我们获取~/.bashrc

    _________ 工作解决方案 _________

    我找到的解决方案是将conda sn-p 复制到一个单独的文件中。

    1。将conda sn-p 从~/.bashrc 复制到~/.bashrc_conda

    将上面提到的sn-p复制到另一个文件,例如~/.bashrc_conda

    确保:

    • 运行 cronjob 的用户有权读取此文件。
    • 其他用户无法写入此文件(安全风险)。

    2。在 crontab -e 中插入 2 行以运行 bash 而不是 sh 并源 ~/.bashrc_conda

    运行 crontab -e 并在 cronjob 之前添加以下 2 行

    SHELL=/bin/bash
    BASH_ENV=~/.bashrc_conda
    

    解释:

    • SHELL=/bin/bash 表示crontab 将通过bash 而不是sh(默认)运行cronjobs。 See post.

    • BASH_ENV=~/.bashrc_condaconda sn-p 发送到由chrontab 运行的bash。请参阅postpost

    3。在crontab -e 中,在所需的.py 脚本执行之前插入cronjob 行conda activate my_env;

    在所需的 conda 环境中每天中午 12:30 执行的脚本的条目示例:

    30 12 * * * conda activate my_env; python /path/to/script.py
    

    在运行 Python 解释器的命令之前注意 conda activate my_env;

    _______________

    ,它成功了。

    有什么缺点吗?

    如果.bashrc 中的conda sn-p 通过conda 更新进行更新,它当然不会反映在单独的.bashrc_conda 文件中。可能需要不时检查更新。

    也可以在该 cronjob 的 end 处附加 ; conda deactivate,但这可能是多余的。

    【讨论】:

      【解决方案3】:

      不要打电话给sh,而是bashsource 是一个 bash 命令。

      - sh scripts/my_script.bash
      + bash scripts/my_script.bash
      

      或者只是

      chmod +x scripts/my_script.bash
      ./scripts/my_script.bash
      

      自从你添加了 bash shebang。

      【讨论】:

      • 是否有更新,现在conda activate my_envsource activate my_env 更受欢迎?我遇到了麻烦...
      • 我不使用 conda。我想你可以使用 sh 或 bash,那么。
      • 想通了。在我的 bash 脚本中,我先运行 source /home/ubuntu/miniconda3/bin/activate,然后运行 ​​conda activate my_env,而不是原始脚本中的 source activate my_env
      【解决方案4】:

      就我而言,当我运行这行 shell 脚本时出现此错误:source activate my_env

      activate: No such file or directory

      所以我将source activate my_env 更改为source /path/to/conda/bin/activate my_env。然后它开始工作。

      【讨论】:

      • 这个解决方案是最简单的!谢谢~~~
      • 确保在使用source cmd 时使用bash(而不是sh)
      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多