ustawianie zmiennej środowiskowej w virtualenv

Mam projekt Heroku, który używa zmiennych środowiskowych, aby uzyskać swoją konfigurację, ale używam virtualenv, aby najpierw przetestować moją aplikację lokalnie.

Czy istnieje sposób na ustawienie zmiennych środowiskowych zdefiniowanych NA zdalnej maszynie wewnątrz virtualenv?

Author: Mahmoud Hossam, 2012-03-04

9 answers

Update

od 17 maja 2017 roku README autoenv stwierdza, że direnv {[5] } jest prawdopodobnie lepszą opcją i oznacza, że autoenv nie jest już utrzymywany.

Stara odpowiedź

Napisałem autoenv aby zrobić dokładnie to:

Https://github.com/kennethreitz/autoenv

 92
Author: Kenneth Reitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 00:12:00

Jeśli używaszvirtualenvwrapper (polecam to zrobić), możesz zdefiniować różne Hooki (preactivate, postactivate, predeactivate, postdeactivate) używając skryptów o tych samych nazwach w $VIRTUAL_ENV/bin/. Potrzebujesz Hooka po aktywacji.

$ 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

Jeśli chcesz zachować tę konfigurację w katalogu projektu, po prostu utwórz dowiązanie symboliczne z katalogu projektu do $VIRTUAL_ENV/bin/postactivate.

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

Możesz nawet zautomatyzować tworzenie dowiązań symbolicznych za każdym razem używasz mkvirtualenv.

Czyszczenie przy dezaktywacji

Pamiętaj, że to nie będzie posprzątać po sobie. Po wyłączeniu virtualenv zmienna środowiskowa będzie trwała. Aby wyczyścić symetrycznie można dodać do $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

Pamiętaj, że jeśli użyjesz tego dla zmiennych środowiskowych, które mogą być już ustawione w Twoim środowisku, to wyłączenie spowoduje ich całkowite wyłączenie po opuszczeniu virtualenv. Więc jeśli to jest w ogóle prawdopodobne, możesz Zapisz poprzednią wartość w miejscu tymczasowym, a następnie odczytaj ją ponownie przy dezaktywacji.

Konfiguracja:

$ 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

Test:

$ echo $SOME_VAR
banana

$ workon myenv

$ echo $SOME_VAR
apple

$ deactivate

$ echo $SOME_VAR
banana
 263
Author: Danilo Bargen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-15 02:06:37

Możesz spróbować:

export ENVVAR=value

W virtualenv_root/bin / activate. Zasadniczo skrypt aktywacji jest wykonywany po rozpoczęciu korzystania z virtualenv, dzięki czemu można umieścić wszystkie swoje dostosowanie tam.

 32
Author: kgr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-04 10:58:45

Używając tylko virtualenv (Bez virtualenvwrapper), ustawienie zmiennych środowiskowych jest łatwe dzięki skryptowi activate, który pozyskujesz w celu aktywacji virtualenv.

Run:

nano YOUR_ENV/bin/activate

Dodaj zmienne środowiskowe na końcu pliku w następujący sposób:

export KEY=VALUE

Możesz również ustawić podobny hook, aby wyłączyć zmienną środowiskową, jak zasugerował Danilo Bargen w jego wielkiej odpowiedzi powyżej, jeśli potrzebujesz.

 28
Author: Nagasaki45,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-04 07:58:25

Chociaż jest tu wiele ładnych odpowiedzi, nie widziałem rozwiązania, które zawiera wyłączanie zmiennych środowiskowych przy dezaktywacji i nie wymaga dodatkowych bibliotek poza virtualenv, więc oto moje rozwiązanie, które polega tylko na edycji / bin / activate, używając zmiennych MY_SERVER_NAME i MY_DATABASE_URL jako przykładów:

W skrypcie Aktywuj powinna znajdować się definicja dezaktywacji, a na jego końcu należy wyłączyć zmienne:

deactivate () {
    ...

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

Następnie na końcu aktywacji skrypt, Ustaw zmienne:

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

W ten sposób nie musisz instalować niczego innego, aby to działało, i nie kończy się na tym, że zmienne są pozostawiane po deactivate virtualenv.

 21
Author: TheLetterN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 20:17:36

Lokalnie w virtualenv są dwie metody, których możesz użyć, aby to przetestować. Pierwszym z nich jest narzędzie instalowane za pomocą Heroku toolbelt (https://toolbelt.heroku.com/). narzędziem jest foreman. Wyeksportuje wszystkie zmienne środowiskowe, które są przechowywane wplik ENV lokalnie, a następnie uruchom procesy aplikacji w swoim pliku Procfile.

Drugi sposób, jeśli szukasz lżejszego podejścia, to mieć .następnie uruchom plik ENV:

export $(cat .env)
 17
Author: CraigKerstiens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 19:40:48

Install autoenv albo przez

$ pip install autoenv

(lub)

$ brew install autoenv

A następnie utwórz plik .env w folderze projektu virtualenv

$ echo "source bin/activate" > .env
Teraz wszystko działa dobrze.
 7
Author: Fizer Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 13:59:11

Innym sposobem na to, który jest zaprojektowany dla django, ale powinien działać w większości ustawień, jest użycie django-dotenv.

 4
Author: Ted,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-30 03:32:45

Jeśli już używasz Heroku, rozważ uruchomienie serwera przez Foreman. Obsługuje plik .env, który jest po prostu listą linii z KEY=VAL, które zostaną wyeksportowane do aplikacji przed jej uruchomieniem.

 3
Author: Michael Mior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-04 01:35:49