установка переменной среды в virtualenv - PullRequest
142 голосов
/ 04 марта 2012

У меня есть проект Heroku, который использует переменные среды для получения своей конфигурации, но я сначала использую virtualenv для локального тестирования своего приложения.

Есть ли способ установить переменные среды, определенные на удаленном компьютере, в virtualenv

Ответы [ 10 ]

281 голосов
/ 21 июня 2012

Если вы используете virtualenvwrapper (я настоятельно рекомендую это сделать), вы можете определять различные хуки (преактивировать, постактивировать, предварительно активировать, постдезактивировать), используя скрипты с одинаковыми именами в $VIRTUAL_ENV/bin/. Вам нужен крючок для постактивации.

$ workon myvenv

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
export DJANGO_DEBUG=True
export S3_KEY=mykey
export S3_SECRET=mysecret

$ echo $DJANGO_DEBUG
True

Если вы хотите сохранить эту конфигурацию в каталоге вашего проекта, просто создайте символическую ссылку из каталога вашего проекта на $VIRTUAL_ENV/bin/postactivate.

$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate

Вы можете даже автоматизировать создание символических ссылок каждый раз, когда вы используете mkvirtualenv .

Очистка при деактивации

Помните, что это не очистит после себя. Когда вы деактивируете virtualenv, переменная окружения сохранится. Чтобы очистить симметрично, вы можете добавить к $VIRTUAL_ENV/bin/predeactivate.

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset DJANGO_DEBUG

$ deactivate

$ echo $DJANGO_DEBUG

Помните, что если использовать это для переменных окружения, которые уже могут быть установлены в вашей среде, то неустановленные значения приведут к их полному сбросу при выходе из virtualenv. Так что, если это вообще возможно, вы можете записать предыдущее значение где-то временно, а затем прочитать его обратно при деактивации.

Установка:

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
if [[ -n $SOME_VAR ]]
then
    export SOME_VAR_BACKUP=$SOME_VAR
fi
export SOME_VAR=apple

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
if [[ -n $SOME_VAR_BACKUP ]]
then
    export SOME_VAR=$SOME_VAR_BACKUP
    unset SOME_VAR_BACKUP
else
    unset SOME_VAR
fi

Тест:

$ echo $SOME_VAR
banana

$ workon myenv

$ echo $SOME_VAR
apple

$ deactivate

$ echo $SOME_VAR
banana
98 голосов
/ 06 марта 2012

Обновление

По состоянию на 17 мая 2017 г. README autoenv утверждает, что direnv , вероятно, является лучшим вариантом и подразумевает, что autoenv больше не поддерживается.

Старый ответ

Я написал autoenv, чтобы сделать именно это:

https://github.com/kennethreitz/autoenv

38 голосов
/ 04 марта 2012

Вы можете попробовать:

export ENVVAR=value

в virtualenv_root / bin / activ.По сути, сценарий активации - это то, что выполняется, когда вы начинаете использовать virtualenv, чтобы вы могли поместить туда все свои настройки.

33 голосов
/ 04 января 2014

Используя только virtualenv (без virtualenvwrapper ), легко установить переменные окружения с помощью сценария activate, который вы используете для активации virtualenv.

Пробег:

nano YOUR_ENV/bin/activate

Добавьте переменные среды в конец файла следующим образом:

export KEY=VALUE

Вы также можете установить аналогичный хук для сброса переменной среды, как это было предложено Данило Баргеном в его великолепном ответе выше, если вам нужно.

25 голосов
/ 28 июля 2016

Хотя здесь есть много хороших ответов, я не видел опубликованного решения, которое включает в себя сброс переменных среды при деактивации и не требует дополнительных библиотек, кроме virtualenv, поэтому вот мое решение, которое просто включает редактирование / bin / activ, используя переменные MY_SERVER_NAME и MY_DATABASE_URL в качестве примеров:

В сценарии активации должно быть определение деактивации, в конце которого вы хотите сбросить переменные:

deactivate () {
    ...

    # Unset My Server's variables
    unset MY_SERVER_NAME
    unset MY_DATABASE_URL
}

Затем в конце сценария активации установите переменные:

# Set My Server's variables
export MY_SERVER_NAME="<domain for My Server>"
export MY_DATABASE_URL="<url for database>"

Таким образом, вам не нужно устанавливать что-либо еще, чтобы заставить его работать, и вы не останетесь с переменными, оставшимися, когда вы deactivate virtualenv.

17 голосов
/ 05 марта 2012

Локально внутри virtualenv есть два метода, которые вы можете использовать для проверки этого.Первый - это инструмент, который устанавливается через инструментальный пояс Heroku (https://toolbelt.heroku.com/). Инструмент является мастером. Он будет экспортировать все переменные среды, которые хранятся в файле .env локально, а затем запустить процессы приложения в вашем Procfile.

Второй способ, если вам нужен более легкий подход, - это локально создать файл .env и запустить:

export $(cat .env)
7 голосов
/ 03 февраля 2014

Установите autoenv либо

$ pip install autoenv

(или)

$ brew install autoenv

И затем создайте файл .env в папке вашего проекта virtualenv

$ echo "source bin/activate" > .env

Теперь все отлично работает.

4 голосов
/ 30 декабря 2013

Другой способ сделать это, который разработан для django, но должен работать в большинстве настроек, это использовать django-dotenv.

3 голосов
/ 04 декабря 2012

Если вы уже используете Heroku, рассмотрите возможность запуска вашего сервера через Foreman . Он поддерживает файл .env, представляющий собой просто список строк с KEY=VAL, который будет экспортирован в ваше приложение до его запуска.

0 голосов
/ 18 ноября 2018

Другой подход состоит в том, чтобы раскошелиться на оболочку bash с работающей веной. Запустите исполняемый файл, содержащий:

# my_env.sh
export MY_VENV=true
bash

В ~ / .bashrc положено:

# .bashrc
if [ "$MY_VENV" = "true" ]; then
    source ~/.pyenv/bin/activate
    export PYTHONPATH=/some/local/libs
    cd /project/path
    PS1='(my_venv:\w)$ '
fi

Выход из разветвленной оболочки восстанавливает исходную среду, и вам не нужно запускать деактивацию.

...