Активация 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.

Другие вопросы по тегам