PATH= «/custom/dir: $PATH» добавление вместо добавления — Conda vs Pyenv

#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
  
  1. Я не знаю, что настраивает /Library/Frameworks/Python.framework/Versions/3.8/bin : этот каталог не существует на моем Mac. Я ранее установил Python без Homebrew, поэтому был создан каталог. Я удалил это, но все еще есть что-то, что экспортирует эту строку $PATH , но я не могу ее найти! У кого-нибудь есть предположение? Я пробовал и grep -r /* это, но это слишком большой поиск для моего ноутбука, чтобы закончить.

  2. Я настроил в своем .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/ !