Активация virtualenv с помощью direnv не активирует virtualenv
Я использую direnv для источника моего virtualenv, когда я перехожу в каталог.
/project
.envrc
/env <--- my virtualenv
.envrc
source env/bin/activate
Когда я меняю каталог на /project
Я получаю вывод:
direnv: loading .envrc
direnv: export +VIRTUAL_ENV -PS2 ~PATH
Он добавляет каталог env к моей переменной окружения PATH, поэтому при запуске which python
а также which pip
и указывают на Python и Пип, что в моем env
каталог
=> which python
/USER/project/env/bin/python
=> which pip
/USER/project/env/bin/pip
Однако это не похоже на запуск source env/bin/activate
как я и ожидаю. Я ожидаю, что он активирует мой virtualenv, добавив имя virtualenv (env) в мое приглашение CLI и предоставив доступ к deactivate
Команда, ничего этого не происходит. Есть ли что-то, что я не понимаю в том, как работают direnv и virtualenv? Я новичок в Python, так что я не уверен, есть ли существующие инструменты, чтобы сделать что-то подобное.
1 ответ
Я думаю, что важно понять, как директив работает, чтобы сначала сформировать правильную ментальную модель; direnv не загружает .envrc
прямо в текущей оболочке. Вместо этого он запускает новую оболочку bash, выполняет .envrc
там записывает изменения в среде и экспортирует diff-bash в текущую оболочку.
Что здесь происходит, так это:
Virtualenv использует $PS1
установить подсказку. Это локальная переменная и поэтому не реэкспортируется. direnv
также фильтры PS1
потому что это вызывает segfaults на старом bash macOS, когда это не установлено.
deactivate()
функция не экспортируется из под-оболочки bash, поскольку она не является переменной окружения.
На практике активация работала, как вы заметили. Python находится на правильном пути и работает pip
или же easy_install
собирается установить вещи в virtualenv. деактивация не требуется, так как direnv автоматически выгружает среду, когда cd
вне каталога.
Чтобы восстановить пользовательское приглашение, в вики доступна дополнительная информация: https://github.com/direnv/direnv/wiki/Python.
Есть "скрытая" функция, позволяющая делать то, что вы хотите, прямо сейчас. Вы должны взглянуть на набор инструментов, который загружает direnv, чтобы вы могли использовать его в.envrc
файлы. Вы можете использоватьlayout
команда с python (layout python3
), чтобы активировать virtualenv при входе в каталог и деактивировать его при выходе из каталога. Он даже позаботится о создании virtualenv в первый раз.
Также взгляните на source_up
которые продолжают загружаться .envrc
файлы выше в файловой системе. Я начинаю все свои проекты с создания.envrc
файл со следующим:
layout python3
source_up
Это автоматически создаст, активирует и деактивирует python virtualenv и продолжит чтение переменных из более высокого уровня. .envrc
файлы. Переменные среды только для текущего проекта войдут в локальный.envrc
.