Festlegen einer Umgebungsvariablen in virtualenv

160

Ich habe ein Heroku-Projekt, das Umgebungsvariablen verwendet, um seine Konfiguration zu erhalten, aber ich verwende virtualenv, um meine App zuerst lokal zu testen.

Gibt es eine Möglichkeit, die auf dem Remotecomputer in virtualenv definierten Umgebungsvariablen festzulegen?

Mahmoud Hanafy
quelle

Antworten:

105

Aktualisieren

Ab dem 17. Mai 2017 heißt es in der README von autoenv, dass direnv wahrscheinlich die bessere Option ist und impliziert, dass autoenv nicht mehr beibehalten wird.

Alte Antwort

Ich habe autoenv geschrieben, um genau das zu tun:

https://github.com/kennethreitz/autoenv

Kenneth Reitz
quelle
12
Sehr lustiges GIF: D
Chachan
3
Nur zu .envIhrer Information, es scheint, dass Dateien, die Heroku erstellt, zumindest meiner Erfahrung nach. Nehmen Sie es also nicht in Ihr Repo auf. Langjähriger Benutzer / großer Fan von autoenv übrigens. Hallo Kenneth, du da Mann!
Galarant
Ist diese Antwort nach der Bearbeitung noch relevant? Was ist Ihre Meinung zu der von Nagasaki45 & TheLetterN
eingefroren
288

Wenn Sie virtualenvwrapper verwenden (ich empfehle dies dringend), können Sie verschiedene Hooks (voraktivieren, nachaktivieren, voraktivieren, nachaktivieren) mithilfe der Skripte mit denselben Namen in definieren $VIRTUAL_ENV/bin/. Sie benötigen den Postaktivierungshaken.

$ 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

Wenn Sie diese Konfiguration in Ihrem Projektverzeichnis behalten möchten, erstellen Sie einfach einen Symlink von Ihrem Projektverzeichnis zu $VIRTUAL_ENV/bin/postactivate.

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

Sie können sogar die Erstellung der Symlinks bei jeder Verwendung von mkvirtualenv automatisieren .

Aufräumen beim Deaktivieren

Denken Sie daran, dass dies nicht nach sich selbst aufräumt. Wenn Sie die virtuelle Umgebung deaktivieren, bleibt die Umgebungsvariable bestehen. Zum symmetrischen Aufräumen können Sie hinzufügen $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

Denken Sie daran, dass wenn Sie dies für Umgebungsvariablen verwenden, die möglicherweise bereits in Ihrer Umgebung festgelegt sind, das Deaktivieren dazu führt, dass diese beim Verlassen der virtuellen Umgebung vollständig deaktiviert werden. Wenn dies also überhaupt wahrscheinlich ist, können Sie den vorherigen Wert irgendwo vorübergehend aufzeichnen und ihn dann bei Deaktivierung wieder einlesen.

Konfiguration:

$ 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

Prüfung:

$ echo $SOME_VAR
banana

$ workon myenv

$ echo $SOME_VAR
apple

$ deactivate

$ echo $SOME_VAR
banana
Danilo Bargen
quelle
Nur eine Präzision: Tun ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivatehat bei mir nicht funktioniert. lnwill einen vollen Weg, also musste ich tunln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
Zoneur
@Zoneur Auf welchem ​​Betriebssystem bist du? Unter Linux arbeiten relative Pfade für ln.
Danilo Bargen
@DaniloBargen Ich benutze LinuxMint 3.2.0. Diese Antwort sagte, dass es lnvolle Wege mag, also habe ich das versucht und es hat funktioniert. Als ich versuchte, catden Symlink mit dem relativen Pfad zu erstellen, hieß es No such file or directory.
Zoneur
@dpwrussel, das hat es fast nicht durch die Überprüfung geschafft, es ist eine gute Ergänzung, aber es ist so bedeutsam, dass es als eigener Beitrag hätte erstellt werden können (was Ihnen einige Wiederholungen eingebracht hätte). Viele gute Antworten sind gut :)
Kent Fredric
2
Und Quellcodeverwaltung? Wie kann dies dazu führen, dass andere Personen ein Projekt klonen und einrichten, das die Umgebung benötigt? var.s?
CpILL
44

Du könntest es versuchen:

export ENVVAR=value

in virtualenv_root / bin / enable. Grundsätzlich wird das Aktivierungsskript ausgeführt, wenn Sie die virtuelle Umgebung verwenden, damit Sie alle Ihre Anpassungen dort vornehmen können.

kgr
quelle
2
Ich bin mir nicht sicher, ob das sauber genug ist, aber es funktioniert definitiv!
Chachan
2
Ja, es ist billig und böse, aber gelegentlich ist es das, was Sie brauchen.
Michael Scheper
1
Ich empfehle dies nicht, ich habe es getan und einige Zeit später wurden alle Aktivierungsskripte (aktivieren, aktivieren.csh, aktivieren.fisch) automatisch überschrieben, so dass ich meine Änderung verlor. Verwenden Sie postaktivieren und voraktivieren.
wil93
Verwenden Sie keine Leerzeichen um die =
Rik Schoonbeek
Könnte auch 'nicht gesetztes ENVVAR' in der deactivatedefinierten Funktion virtualenv_root / bin / enabled hinzufügen, um das Einstellen und Deaktivieren auszugleichen
Lou Zell
42

Wenn Sie nur virtualenv (ohne virtualenvwrapper ) verwenden, können Sie Umgebungsvariablen über das von activateIhnen bezogene Skript einfach festlegen, um virtualenv zu aktivieren.

Lauf:

nano YOUR_ENV/bin/activate

Fügen Sie die Umgebungsvariablen wie folgt am Ende der Datei hinzu:

export KEY=VALUE

Sie können auch einen ähnlichen Hook festlegen, um die Umgebungsvariable zu deaktivieren, wie von Danilo Bargen in seiner großartigen Antwort oben vorgeschlagen, falls erforderlich.

Nagasaki45
quelle
9
ein viel vernünftigerer Ansatz IMO. Überschreiben, cdnur um Umgebungsvariablen zu haben? Schauder
Michel Müller
Wie wäre es mit der Bereinigung nach der Deaktivierung?
Buncis
36

Obwohl es hier viele nette Antworten gibt, wurde keine Lösung veröffentlicht, die sowohl das Deaktivieren von Umgebungsvariablen beim Deaktivieren enthält als auch keine zusätzlichen Bibliotheken darüber hinaus erfordert. virtualenvHier ist meine Lösung, die nur das Bearbeiten / Bin / Aktivieren mithilfe von Variablen MY_SERVER_NAMEund MY_DATABASE_URLals Beispiele:

Das Aktivierungsskript sollte eine Definition für Deaktivierung enthalten, und Sie möchten Ihre Variablen am Ende deaktivieren:

deactivate () {
    ...

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

Legen Sie dann am Ende des Aktivierungsskripts die Variablen fest:

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

Auf diese Weise müssen Sie nichts anderes installieren, damit es funktioniert, und es bleiben keine Variablen übrig, wenn Sie deactivatedie virtuelle Umgebung verwenden.

TheLetterN
quelle
3
Ich mag diesen Ansatz, weil ich keine externen Bibliotheken oder Apps möchte, aber das Problem dabei ist, dass Sie alle Einstellungen verlieren, wenn Sie die Umgebung neu erstellen.
VStoykov
2
Der Vorteil dieses Ansatzes ist die Geschwindigkeit des Aufbaus und der Mangel an Magie. Wenn Sie Umgebungsvariablen von der Quellcodeverwaltung fernhalten, kehren Sie immer wieder zu dem Problem zurück, Ihre Geheimnisse / Einstellungen beim Wiederherstellen von Umgebungen möglicherweise zu zerstören.
Anthony Manning-Franklin
Wird das Verzeichnis virtualenv in das Repository eingecheckt, damit dies funktioniert? Was ist, wenn die Variablen Geheimnisse enthalten, die Sie im Repo nicht möchten? Wie würden Sie damit umgehen?
Fraxtur
2
Ich verstehe nicht wirklich, warum es eine gute Idee wäre, eine virtuelle Umgebung in Ihr Repository aufzunehmen, da diese nicht sehr portabel ist, aber ich kann mir vorstellen, dass Sie Ihre Exporte in eine separate Datei anstatt in das Aktivierungsskript legen und die Datei als Quelle verwenden könnten, wenn Es ist vorhanden und fügt diese Datei nicht zu Ihrem Repository hinzu.
TheLetterN
18

Lokal innerhalb einer virtuellen Umgebung gibt es zwei Methoden, mit denen Sie dies testen können. Das erste ist ein Tool, das über den Heroku-Toolbelt (https://toolbelt.heroku.com/) installiert wird. Das Werkzeug ist Vorarbeiter. Es exportiert alle Ihre Umgebungsvariablen, die lokal in einer ENV-Datei gespeichert sind, und führt dann App-Prozesse in Ihrer Procfile aus.

Der zweite Weg, wenn Sie nach einem leichteren Ansatz suchen, besteht darin, eine .env-Datei lokal zu haben und dann auszuführen:

export $(cat .env)
CraigKerstiens
quelle
6

Installieren Sie autoenv entweder von

$ pip install autoenv

(oder)

$ brew install autoenv

Erstellen .envSie anschließend eine Datei in Ihrem virtualenv-Projektordner

$ echo "source bin/activate" > .env

Jetzt funktioniert alles gut.

Fizer Khan
quelle
3

Wenn Sie Heroku bereits verwenden, sollten Sie Ihren Server über Foreman ausführen . Es unterstützt eine .envDatei, bei der es sich lediglich um eine Liste von Zeilen handelt KEY=VAL, die vor der Ausführung in Ihre App exportiert werden.

Michael Mior
quelle
3

Eine andere Möglichkeit, die für Django entwickelt wurde, aber in den meisten Einstellungen funktionieren sollte, ist die Verwendung von Django-Dotenv.

Ted
quelle
1

So aktivieren Sie virtualenv im envVerzeichnis und exportieren die verwendeten .envVerwendungsvariablen:

source env/bin/activate && set -a; source .env; set +a
Daniil Mashkin
quelle
Speichern Sie auf Aliase mitecho 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
Daniil Mashkin