Как экспортировать PYTHONPATH, когда я активирую виртуальную среду на pyenv-virtualenv?

Я использую pyenv и его плагин pyenv-virtualenv.

Мои вопросы: как изменить переменную среды PYTHONPATH, когда я активирую некоторую виртуальную среду на pyenv-virtualenv?

$ pyenv activate myenv
$ echo $PYTHONPATH  # I want this variable!

Когда я использовал простой virtualenv, я мог изменить PYTHONPATH, отредактировав virtualenv_home/your_env/bin/activate

export OLD_PYTHONPATH=$PYTHONPATH
export PYTHONPATH="/path/to/you/want"

Какой файл я должен отредактировать для pyenv-virtualenv?


person keisuke    schedule 02.02.2016    source источник


Ответы (1)


Вы просто устанавливаете PYTHONPATH как обычно, будь то в сценарии запуска вашей оболочки или где-либо еще. Когда вы переключаетесь на виртуальную среду, управляемую pyenv, с помощью pyenv virtualenv, она автоматически добавит все необходимые каталоги для этой виртуальной среды в sys.path, но любые каталоги, которые вы определили в переменной PYTHONPATH, будут предшествовать им.

Добавлено на основе обсуждения в комментариях ниже:

Вы можете создавать скрипты ловушек для данной команды pyenv <command> в $PYENV_HOME/pyenv.d/<command>/. Вы даже можете сделать это для «фарфоровых» команд pyenv, которые обычно не вызываются пользователем напрямую.

Должна быть возможность создать хук для activate (который неявно вызывается pyenv-virtualenv при переключении на virtualenv), который анализирует имя virtualenv и устанавливает $PYTHONPATH на основе этого.

Примечание. Я уже писал хуки для pyenv, но явно не тестировал это решение.

person wjv    schedule 03.02.2016
comment
Да, он отлично работает почти во всех случаях, но в некоторых редких случаях он не работает у меня. Предположим, у меня есть модули с именем mod в virtualenv env1 и в env2. В env1 я хочу использовать mod в env1, а в env2 я хочу использовать mod в env2. Это невозможно? - person keisuke; 03.02.2016
comment
Можете ли вы понять, что отличается от случаев, когда это не работает? Может быть, мы сможем разобрать эту штуку и выяснить, что происходит… - person wjv; 03.02.2016
comment
Отвечая на ваш отредактированный комментарий: Да, вы можете установить один и тот же модуль в нескольких виртуальных средах. Вам не нужно делать ничего особенного; вам не нужно редактировать $PYTHONPATH. - person wjv; 03.02.2016
comment
Если mod установлен в site-packages, мне не нужен PYTHONPATH. Насколько я понимаю, PYTHONPATH используется для скриптов Python, которые не установлены. - person keisuke; 03.02.2016
comment
$PYTHONPATH предназначен для указания списка каталогов, в которых интерпретатор ищет модули (в дополнение к стандартным расположениям). Так да. Вы хотите, чтобы две версии модуля mod были доступны в двух разных внешних местах для env1 и env2? Другими словами, вы хотите изменить значение $PYTHONPATH в зависимости от активной виртуальной среды? - person wjv; 03.02.2016
comment
Да, я хочу изменить значение PYTHONPATH в зависимости от активного виртуального окружения, как я сказал в своем вопросе. Я знаю, что присваивать одинаковые имена разным модулям — очень плохая практика, но я думаю, что pyenv + virtualenv должны решить эту проблему, но я не могу найти способ. - person keisuke; 03.02.2016
comment
Я исправил свой ответ выше. - person wjv; 03.02.2016