#python #anaconda #conda #zsh #pyenv
#python #анаконда #conda #zsh #pyenv
Вопрос:
У меня есть Mac (последнее обновление программного обеспечения) с Pyenv и Anaconda. Я управляю пакетами с помощью Homebrew и установил с ним Python 3. Когда echo $PATH
я получаю следующее:
/Library/Frameworks/Python.framework/Versions/3.8/bin:
/usr/local/bin:
/usr/bin:
/bin:
/usr/local/sbin:
/usr/sbin:
/sbin:
/Library/TeX/texbin:
/Users/luca/.pyenv/versions/anaconda3-2020.02/condabin:
/Users/luca/.pyenv/versions/3.8.5/bin:
/Users/luca/.pyenv/bin
-
Я не знаю, что настраивает
/Library/Frameworks/Python.framework/Versions/3.8/bin
: этот каталог не существует на моем Mac. Я ранее установил Python без Homebrew, поэтому был создан каталог. Я удалил это, но все еще есть что-то, что экспортирует эту строку$PATH
, но я не могу ее найти! У кого-нибудь есть предположение? Я пробовал иgrep -r /*
это, но это слишком большой поиск для моего ноутбука, чтобы закончить. -
Я настроил в своем
.zshenv
коде для инициализацииpyenv
иconda
. Конечно, я написалPATH="/dir/to/conda/bin:$PATH"
и то же самое дляpyenv
(см. Код ниже). Я не понимаю, почему, но они заканчиваются в конце$PATH
. Кто-нибудь знает почему? Это изeval "$(pyenv init -)"
-за того, что его оценивали раньшеconda
?
# >>> pyenv initialize
export PYENV_SHELL=$SHELL
export PATH="/Users/luca/.pyenv/bin:$PATH"
export PATH="/Users/luca/.pyenv/versions/3.8.5/bin:$PATH" #export Python 3.8 bin directory
if command -v pyenv 1>/dev/null 2>amp;1; then
eval "$(pyenv init -)"
fi
# <<< pyenv initialize <<<
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/luca/.pyenv/versions/anaconda3-2020.02/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/luca/.pyenv/versions/anaconda3-2020.02/etc/profile.d/conda.sh" ]; then
. "/Users/luca/.pyenv/versions/anaconda3-2020.02/etc/profile.d/conda.sh"
else
export PATH="/Users/luca/.pyenv/versions/anaconda3-2020.02/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
Ответ №1:
У меня точно такая же проблема, и я не смог найти никакого другого источника о том, почему среда conda добавляется вместо добавления. Я добавил следующий код в свой .bash_profile (после инициализации conda), который меняет порядок расположения всех путей. Это определенно ужасная практика, но это может быть быстрым решением для тех, кто застрял на той же проблеме.
locations=($(echo $PATH | tr ":" "n"))
path=""
for (( idx=${#locations[@]}-2 ; idx>=0 ; idx-- )) ; do
# Skip the last path location since this would put the general /Users/XXX/opt/anaconda3/condabin first
# To not do this change the -2 to -1
path="${path}:${locations[$idx]}"
done
path="${path:1}"
PATH=$path
export $PATH
Как отмечено в комментарии, я не добавляю местоположение «/Users/XXX/opt/anaconda3/condabin», поскольку это испортило бы местоположение моей среды, которое находится предпоследним. Пожалуйста, изучите свою собственную переменную path и примите соответствующее решение.
РЕДАКТИРОВАТЬ: если у кого-нибудь есть лучшее решение, пожалуйста, дайте мне знать!
Комментарии:
1. Я, наконец, понял решение этой проблемы: добавлю ответ соответствующим образом, однако ссылка на полный и оригинальный ответ здесь
Ответ №2:
TL; DR
В macOS, если вы поместите любой код, который изменяется $PATH
в macOS .zshenv
, он будет переопределен. Вы должны поместить его в .zshrc
или где-нибудь еще, который затем будет получен вашим .zshrc
.
Полное объяснение
Как ответили в Unix amp; Linux Stack Exchange, при получении zsh файлы считываются в следующем порядке:
etc/zshenv/
-> $ZDOTDIR/.zshenv/
-> etc/zprofile/
-> $ZDOTDIR/.zprofile/
-> etc/zshrc/
-> $ZDOTDIR/.zshrc/
-> etc/zlogin/
-> $ZDOTDIR/.zlogin/
В macOS /etc/zprofile
создается скрипт, который переопределяет $PATH в соответствии с содержимым этих файлов:
/etc/paths
/etc/paths.d
/etc/manpaths
/etc/manpaths.d
Поэтому вы должны помещать не любую строку, которая изменяется $PATH
в вашем $ZDOTDIR/.zshenv
, а в любом файле, полученном после этого (например $ZDOTDIR/.zshrc
). Не редактируйте файлы в /etc/
!