установка переменной окружения в виртуальное окружение
У меня есть проект Heroku, который использует переменные среды для получения своей конфигурации, но я использую virtualenv для тестирования моего приложения локально.
есть ли способ установить переменные среды, определенные на удаленной машине внутри virtualenv?
9 ответов:
обновление
по состоянию на 17 мая 2017 года в README autoenv говорится, что direnv вероятно, лучший вариант и подразумевает, что autoenv больше не поддерживается.
ответ
Я написал 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. Поэтому, если это вообще возможно, вы можете записать Предыдущее значение где-то временно, а затем прочитать его обратно при деактивации.
Setup:
$ 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 / activate. В основном сценарий активации-это то, что выполняется при запуске 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.
- оригинал -https://github.com/jacobian/django-dotenv
- более полнофункциональная вилка -https://github.com/tedtieken/django-dotenv-rw (я написал это, чтобы иметь возможность установить мой пульт дистанционного управления .env настройки на webfaction из моей локальной командной строки, heroku испортил меня)
Если вы уже используете Heroku, рассмотрите возможность запуска вашего сервера через старшина. Он поддерживает
.env
файл, который представляет собой просто список строк сKEY=VAL
это будет экспортировано в ваше приложение перед его запуском.