ustawienie zmiennej środowiskowej w virtualenv


160

Mam projekt Heroku, który używa zmiennych środowiskowych do uzyskania swojej konfiguracji, ale najpierw używam virtualenv do testowania mojej aplikacji lokalnie.

Czy istnieje sposób na ustawienie zmiennych środowiskowych zdefiniowanych na maszynie zdalnej w virtualenv?

Odpowiedzi:


106

Aktualizacja

Od 17 maja 2017 plik README autoenv stwierdza, że direnv jest prawdopodobnie lepszą opcją i sugeruje, że autoenv nie jest już utrzymywane.

Stara odpowiedź

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

https://github.com/kennethreitz/autoenv


12
Bardzo zabawny gif: D
chachan

3
Dla Twojej wiadomości wydaje się, że .envpliki Bork Heroku buduje, przynajmniej z mojego doświadczenia. Więc nie umieszczaj go w swoim repozytorium. Wieloletni użytkownik / wielki fan autoenv btw. Cześć Kenneth, ty stary!
galarant

Czy ta odpowiedź jest nadal aktualna po edycji? Jaka jest Twoja opinia o rozwiązaniu zaproponowanym przez Nagasaki45 i TheLetterN
zamrożone

288

Jeśli używasz virtualenvwrapper (bardzo polecam to zrobić), możesz zdefiniować różne hooki (preactivate, postactivate, preactivate, postdeactivate) przy użyciu skryptów o tych samych nazwach w $VIRTUAL_ENV/bin/. Potrzebujesz haka 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 łącze 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, gdy używasz mkvirtualenv .

Czyszczenie po dezaktywacji

Pamiętaj, że to nie posprząta po sobie. Po dezaktywacji virtualenv zmienna środowiskowa pozostanie. Aby wyczyścić symetrycznie, możesz 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żywasz tego dla zmiennych środowiskowych, które mogą już być ustawione w twoim środowisku, to nieustawienie spowoduje ich całkowite wyłączenie przy opuszczaniu virtualenv. Więc jeśli jest to w ogóle prawdopodobne, możesz tymczasowo nagrać poprzednią wartość, a następnie odczytać ją ponownie po dezaktywacji.

Ustawiać:

$ 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

Tylko precyzja: ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivatepraca nie działa na mnie. lnchce pełnej ścieżki, więc musiałem to zrobićln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
Zoneur

@Zoneur Z jakiego systemu operacyjnego korzystasz? W Linuksie działają ścieżki względne ln.
Danilo Bargen

@DaniloBargen Używam LinuxMint 3.2.0. Ta odpowiedź mówi, że lnlubi pełne ścieżki, więc spróbowałem i zadziałało. Kiedy próbowałem uzyskać catlink symboliczny ze ścieżką względną, powiedział No such file or directory.
Zoneur

@dpwrussel, który prawie nie przeszedł przez recenzję, jest to dobry dodatek, ale jest tak znaczący, że mógłby zostać opublikowany jako własny post (który dałby ci trochę reputacji). Wiele dobrych odpowiedzi jest dobrych :)
Kent Fredric

2
A kontrola źródła? Jak to się przekłada na inne osoby klonujące i konfigurujące projekt, który potrzebuje środowiska. var.s?
CpILL

44

Możesz spróbować:

export ENVVAR=value

w virtualenv_root / bin / activ. Zasadniczo skrypt aktywacyjny jest wykonywany, gdy zaczynasz używać virtualenv, dzięki czemu możesz tam umieścić wszystkie swoje ustawienia.


2
Nie jestem pewien, czy to wystarczająco czyste, ale definitywnie działa!
chachan

2
Tak, jest tani i paskudny, ale czasami tego potrzebujesz.
Michael Scheper

1
Nie polecam tego, zrobiłem to i jakiś czas później wszystkie skrypty aktywujące (aktywuj, aktywuj.csh, aktywuj.fish) zostały nadpisane automatycznie, więc straciłem zmianę. Użyj funkcji postaktywacji i dezaktywacji wstępnej.
wil93

nie używaj spacji wokół =
Rik Schoonbeek

Można również dodać `` unset ENVVAR '' w deactivatefunkcji zdefiniowanej virtualenv_root / bin / activ, aby ustawić balans i rozbrajać
Lou Zell

42

Używając tylko virtualenv (bez virtualenvwrapper ), ustawianie zmiennych środowiskowych jest łatwe za pomocą activateskryptu, który pozyskujesz w celu aktywacji virtualenv.

Biegać:

nano YOUR_ENV/bin/activate

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

export KEY=VALUE

Możesz także ustawić podobny punkt zaczepienia, aby anulować ustawienie zmiennej środowiskowej, zgodnie z sugestią Danilo Bargena w jego świetnej odpowiedzi powyżej, jeśli potrzebujesz.


9
znacznie bardziej rozsądne podejście IMO. przesłanianie cdtylko po to, by mieć zmienne środowiskowe? dreszcz
Michel Müller

co powiesz na czyszczenie po dezaktywacji?
buncis

36

Chociaż jest tutaj wiele fajnych odpowiedzi, nie widziałem opublikowanego rozwiązania, które obejmuje usuwanie zmiennych środowiskowych przy dezaktywacji i nie wymaga dodatkowych bibliotek poza tym virtualenv, więc oto moje rozwiązanie, które polega tylko na edycji / bin / aktywowaniu za pomocą zmienne MY_SERVER_NAMEi MY_DATABASE_URLjako przykłady:

W skrypcie aktywacyjnym powinna znajdować się definicja dezaktywacji, a na końcu chcesz usunąć ustawienia zmiennych:

deactivate () {
    ...

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

Następnie na końcu skryptu aktywacji 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 działał, i nie kończy się na tym, że zmienne pozostają po deactivateuruchomieniu virtualenv.


3
Podoba mi się to podejście, ponieważ nie chcę zewnętrznych bibliotek ani aplikacji, ale problem polega na tym, że jeśli przebudujesz środowisko, stracisz wszystkie ustawienia.
VStoykov

2
Zaletą tego podejścia jest szybkość konfiguracji i brak magii. Utrzymywanie zmiennych środowiskowych poza kontrolą źródła zawsze prowadzi z powrotem do problemu potencjalnego zniszczenia twoich sekretów / ustawień podczas odbudowywania środowisk.
Anthony Manning-Franklin

Czy katalog virtualenv kończy się wpisywaniem do repozytorium, aby to zadziałało? Co jeśli zmienne zawierają sekrety, których nie chcesz w repozytorium? Jak byś sobie z tym poradził?
fraxture

2
Naprawdę nie rozumiem, dlaczego byłoby dobrym pomysłem umieszczenie virtualenv w swoim repozytorium, ponieważ nie są one zbyt przenośne, ale wyobrażam sobie, że możesz umieścić swoje eksporty w osobnym pliku zamiast skryptu aktywacyjnego i pobrać plik, jeśli jest obecny i nie dodawaj tego pliku do repozytorium.
TheLetterN

18

Lokalnie w ramach virtualenv można to przetestować na dwa sposoby. Pierwsza to narzędzie, które jest instalowane za pośrednictwem paska narzędzi Heroku (https://toolbelt.heroku.com/). Narzędziem jest brygadzista. Wyeksportuje wszystkie zmienne środowiskowe, które są przechowywane lokalnie w pliku .env, a następnie uruchomi procesy aplikacji w pliku Procfile.

Drugim sposobem, jeśli szukasz lżejszego podejścia, jest posiadanie pliku .env lokalnie, a następnie uruchomienie:

export $(cat .env)

6

Zainstaluj autoenv albo przez

$ pip install autoenv

(lub)

$ brew install autoenv

Następnie utwórz .envplik w folderze projektu virtualenv

$ echo "source bin/activate" > .env

Teraz wszystko działa dobrze.


3

Jeśli korzystasz już z Heroku, rozważ uruchomienie serwera przez Foreman . Obsługuje .envplik, który jest po prostu listą wierszy, KEY=VALktóre zostaną wyeksportowane do Twojej aplikacji przed uruchomieniem.



1

Aby aktywować virtualenv w envkatalogu i wyeksportować używane zmienne envinroment .env:

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

zapisz do aliasów zecho 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
Daniil Mashkin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.