встановлення змінної середовища у virtualenv


160

У мене є проект Heroku, який використовує змінні середовища для отримання його конфігурації, але я використовую virtualenv, щоб спершу перевірити свій додаток локально.

Чи є спосіб встановити змінні середовища, визначені на віддаленій машині, всередині virtualenv?

Відповіді:


106

Оновлення

Станом на 17 травня 2017 року README autoenv стверджує, що direnv - це, мабуть, кращий варіант, а це означає, що autoenv більше не підтримується.

Стара відповідь

Я написав autoenv, щоб зробити саме це:

https://github.com/kennethreitz/autoenv


12
Дуже смішний gif: D
чачан

3
Просто FYI здається, що .envфайли bork Heroku створюються, принаймні, з мого досвіду. Тому не включайте його до репо. Довгий користувач / величезний шанувальник autoenv btw. Привіт Кеннет, ти, чоловіче!
галарант

Ця відповідь все-таки актуальна після редагування? Яка ваша думка щодо рішення, запропонованого Nagasaki45 & TheLetterN
заморожено

288

Якщо ви використовуєте 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

Просто точність: робити ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivateмені не вийшло. lnхоче повний шлях, тому я повинен був зробитиln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
Zoneur

@Zoneur На якій ОС ви працюєте? Під Linux працюють відносні шляхи ln.
Данило Барген

@DaniloBargen Я використовую LinuxMint 3.2.0. Ця відповідь сказала, що lnподобається повний шлях, тому я спробував це, і це спрацювало. Коли я спробував до catсимпосилання з відносним шляхом, він сказав No such file or directory.
Зонур

@dpwrussel, що майже не зробив це через перегляд, це гарне доповнення, але його настільки вагомим, що він міг би бути зроблений як його власний пост (який би отримав вам деяку репутацію). Багато хороших відповідей хороші :)
Кент Фредрік

2
А управління джерелом? Як це перекладається на інших людей, що клонують та створюють проект, який потребує оточення. var.s?
CpILL

44

Ви можете спробувати:

export ENVVAR=value

у virtualenv_root / bin / activate. В основному, сценарій активації - це те, що виконується, коли ви починаєте використовувати virtualenv, щоб ви могли помістити туди всі свої налаштування.


2
Не впевнений, чи це досить чисто, але остаточно працює!
чачан

2
Так, це дешево і противно, але періодично це те, що потрібно.
Майкл Шепер

1
Я не рекомендую цього, я це зробив, і десь пізніше всі сценарії активації (activate, activate.csh, activate.fish) були автоматично перезаписані, тому я втратив зміни. Використовуйте післяактивацію та попередню активацію.
wil93

не використовуйте пробілів навколо =
Rik Schoonbeek

Можна також додати 'unset ENVVAR' у deactivateфункції, визначеній virtualenv_root / bin / activate, щоб встановити баланс та знеструмити
Lou Zell

42

Використовуючи лише virtualenv (без virtualenvwrapper ), налаштовувати змінні середовища легко через activateсценарій, який ви шукаєте, щоб активувати virtualenv.

Виконати:

nano YOUR_ENV/bin/activate

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

export KEY=VALUE

Ви також можете встановити подібний гачок, щоб скинути змінну середовища, як запропонував Данило Барген у своїй чудовій відповіді вище, якщо вам потрібно.


9
набагато більш здоровий підхід до ІМО. переосмислення cdпросто для змінних середовищ? здригаються
Мішель Мюллер

як щодо очищення після деактивного?
buncis

36

Хоча тут є багато приємних відповідей, я не побачив рішення, яке включає в себе нестабільні змінні середовища для деактивації і не потребує додаткових бібліотек virtualenv, тому ось моє рішення, яке включає лише редагування / бін / активацію, використовуючи змінні 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>"

Таким чином, вам не доведеться встановлювати нічого іншого, щоб він працював, і ви не закінчилися тим, що змінні залишаються, коли ви deactivatevirtualenv.


3
Мені подобається такий підхід, тому що я не хочу зовнішніх ліб або додатків, але проблема в тому, що якщо ви відновите середовище, ви втратите всі свої налаштування.
В.Стойков

2
Перевага такого підходу - швидкість налаштування та відсутність магії. Захист змінних середовищ поза контролем джерела завжди поверне вас до проблеми потенційного знищення ваших секретів / налаштувань під час відновлення середовищ.
Ентоні Меннінг-Франклін

Чи в кінцевому підсумку каталог virtualenv перевіряється в сховищі, щоб це працювало? Що робити, якщо змінні зберігають секрети, які ви не хочете в репо? Як би ти впорався з цим?
фракція

2
Я не розумію, чому було б гарною ідеєю включити virtualenv у ваше сховище, оскільки вони не дуже портативні, але я думаю, що ви можете помістити свій експорт в окремий файл замість активаційного скрипту та джерело файлу, якщо він присутній, і не додайте цей файл у ваше сховище.
TheLetterN

18

Локально в рамках virtualenv є два методи, які ви можете використати для перевірки цього. Перший - це інструмент, який встановлюється за допомогою інструментального пояса Heroku (https://toolbelt.heroku.com/). Інструмент - бригадир. Він експортує всі ваші змінні середовища, які зберігаються у файлі .env локально, а потім запустить процеси додатків у вашому Procfile.

Другий спосіб, якщо ви шукаєте більш легкого підходу, - це мати файл .env локально, тоді запустіть:

export $(cat .env)

6

Встановіть autoenv або від

$ pip install autoenv

(або)

$ brew install autoenv

А потім створити .envфайл у папці проекту virtualenv

$ echo "source bin/activate" > .env

Зараз все працює добре.


3

Якщо ви вже використовуєте Heroku, подумайте про запуск вашого сервера через Foreman . Він підтримує .envфайл, який є просто списком рядків, KEY=VALякі будуть експортовані у ваш додаток до запуску.


3

Ще один спосіб зробити це для django, але він повинен працювати в більшості налаштувань - це використовувати django-dotenv.


1

Щоб активувати virtualenv в envкаталозі та експортувати змінні середовища, що зберігаються у .envвикористанні:

source env/bin/activate && set -a; source .env; set +a

зберегти псевдоніми зecho 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
Даніїл Машкін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.