активация conda на CI Трэвиса

#bash #shell #anaconda #travis-ci #conda

#bash #оболочка #анаконда #travis-ci #conda

Вопрос:

Я использую conda 4.6.8 для тестирования пакета python в conda env на Travis CI. Я хочу заменить мою старую source activate ENVNAME строку новой conda activate ENVNAME командой в моей конфигурации Travis CI. Если я запущу это на Travis:

 >>> conda update -n base conda
>>> conda init
no change     /home/travis/miniconda/condabin/conda
no change     /home/travis/miniconda/bin/conda
no change     /home/travis/miniconda/bin/conda-env
no change     /home/travis/miniconda/bin/activate
no change     /home/travis/miniconda/bin/deactivate
no change     /home/travis/miniconda/etc/profile.d/conda.sh
no change     /home/travis/miniconda/etc/fish/conf.d/conda.fish
no change     /home/travis/miniconda/shell/condabin/Conda.psm1
no change     /home/travis/miniconda/shell/condabin/conda-hook.ps1
no change     /home/travis/miniconda/lib/python3.7/site-packages/xonsh/conda.xsh
no change     /home/travis/miniconda/etc/profile.d/conda.csh
modified      /home/travis/.bashrc
==> For changes to take effect, close and re-open your current shell. <==
  

Как я могу «закрыть и повторно открыть» свою оболочку на Travis? Потому что в противном случае я не смогу активировать свою среду conda:

 >>> conda create -n TEST package_names
>>> conda activate TEST
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run
    $ conda init <SHELL_NAME>
Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell
See 'conda init --help' for more information and options.
IMPORTANT: You may need to close and restart your shell after running 'conda init'.
The command "conda activate TEST" failed and exited with 1 during .
Your build has been stopped.
  

Ответ №1:

Не уверен, что в настоящее время он поддерживается, поскольку официальный документ все еще использует source в travis.yml.

Что conda init делает?

Эта новая команда должна гармонизировать способ настройки пользователями своих оболочек для возможности вызова conda activate .

На самом деле, если вы запустите conda init --dry-run --verbose , вы увидите, что он пытается получить исходный код conda.sh из вашего ~/.bashrc (предполагая, что вы используете Bash, исходя из информации, упомянутой в вашем вопросе).

И conda.sh определит conda() функцию, которая будет перехватывать несколько команд, среди которых activate и deactivate и отправлять в $CONDA_EXE :

 conda() {
    if [ "$#" -lt 1 ]; then
        "$CONDA_EXE"
    else
        local cmd="$1"
        shift
        case "$cmd" in
            activate|deactivate)
                __conda_activate "$cmd" "$@"
                ;;
            install|update|upgrade|remove|uninstall)
                "$CONDA_EXE" "$cmd" "$@" amp;amp; __conda_reactivate
                ;;
            *) "$CONDA_EXE" "$cmd" "$@" ;;
        esac
    fi
}
  

Таким образом, если эта функция не определена в вашей локальной оболочке, вы не сможете вызвать conda activate .

Подсказка о решении? (не тестировался для Travis CI)

Единственный совет, который я могу предложить, это попробовать source $(conda info --root)/etc/profile.d/conda.sh и затем conda activate . Это должно выполняться примерно так же, как conda init если предположить, что вы используете производные от Bourne shell.

Для csh есть $(conda info --root)/etc/profile.d/conda.csh , и для fish есть $(conda info --root)/etc/fish/conf.d/conda.fish

Примечание: хотя это решение не тестировалось для Travis CI, у меня работает с bash. Конечно, исполняемый файл conda должен быть найден в, PATH для conda info --root правильной работы.

Комментарии:

1. Обновление: начиная с версии conda 4.6 (возможно, более ранней), официальные документы перенесены на conda activate . Они по-прежнему не используют conda init , вместо этого получая скрипт напрямую, как в этом ответе .