установка переменной среды в virtualenv

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

есть ли способ установить переменные среды, определенные на удаленной машине внутри virtualenv?

9 ответов


обновление

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

ответ

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

https://github.com/kennethreitz/autoenv


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

$ 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

помните, что если использовать это для переменных среды, которые уже могут быть установлены в вашей среде, то unset приведет к их полностью не настроен на выход из 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

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

export ENVVAR=value

в virtualenv_root/bin/активировать. В основном скрипт активации выполняется при запуске virtualenv, поэтому вы можете поместить туда всю свою настройку.


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

Run:

nano YOUR_ENV/bin/activate

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

export KEY=VALUE

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


хотя здесь есть много хороших ответов, я не видел решения, которое включает в себя отключенные переменные среды при деактивации и не требует дополнительных библиотек за пределами virtualenv, вот мое решение, которое просто включает редактирование /bin / activate, используя переменные 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.


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

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

export $(cat .env)

установить autoenv или

$ pip install autoenv

(или)

$ brew install autoenv

и затем создать .env файл в папке проекта virtualenv

$ echo "source bin/activate" > .env

теперь все работает нормально.


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


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