#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
, вместо этого получая скрипт напрямую, как в этом ответе .