impostazione di una variabile d'ambiente in virtualenv


160

Ho un progetto Heroku che utilizza variabili di ambiente per ottenere la sua configurazione, ma uso virtualenv per testare prima la mia app localmente.

Esiste un modo per impostare le variabili di ambiente definite sul computer remoto all'interno di virtualenv?

Risposte:


106

Aggiornare

A partire dal 17 maggio 2017 il README di autoenv afferma che direnv è probabilmente l'opzione migliore e implica che autoenv non è più mantenuto.

Vecchia risposta

Ho scritto autoenv per fare esattamente questo:

https://github.com/kennethreitz/autoenv


12
Gif molto divertente: D
chachan,

3
Solo FYI sembra che i .envfile bork di Heroku costruiscano, almeno nella mia esperienza. Quindi non includerlo nel tuo repository. Utente da molto tempo / grande fan di autoenv btw. Ciao Kenneth, amico!
galarant

Questa risposta è ancora pertinente dopo la modifica? Qual è la tua opinione sulla soluzione suggerita da Nagasaki45 & TheLetterN
congelata il

288

Nel caso in cui utilizzi virtualenvwrapper (consiglio vivamente di farlo), puoi definire diversi hook (preactivate, postactivate, preeactivate, postdeactivate) usando gli script con gli stessi nomi in $VIRTUAL_ENV/bin/. È necessario il gancio postattivo.

$ 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

Se si desidera mantenere questa configurazione nella directory del progetto, è sufficiente creare un collegamento simbolico dalla directory del progetto a $VIRTUAL_ENV/bin/postactivate.

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

Puoi persino automatizzare la creazione dei symlink ogni volta che usi mkvirtualenv .

Pulizia in disattivazione

Ricorda che questo non pulirà dopo se stesso. Quando si disattiva virtualenv, la variabile di ambiente persiste. Per pulire simmetricamente puoi aggiungere a $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

Ricorda che se lo usi per le variabili di ambiente che potrebbero essere già state impostate nel tuo ambiente, unset determinerà la loro totale disattivazione all'uscita da virtualenv. Quindi, se è del tutto probabile, è possibile registrare il valore precedente da qualche parte temporaneamente, quindi rileggerlo su Disattiva.

Impostare:

$ 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

Solo una precisione: fare ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivatenon ha funzionato per me. lnvuole un percorso completo, quindi ho dovuto fareln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
Zoneur

@Zoneur Su quale sistema operativo sei? Sotto Linux i percorsi relativi funzionano per ln.
Danilo Bargen,

@DaniloBargen Uso LinuxMint 3.2.0. Questa risposta diceva che mi lnpiacciono i percorsi completi, quindi l'ho provato e ha funzionato. Quando ho provato catil collegamento simbolico con relativo percorso, ha detto No such file or directory.
Zoneur,

@dpwrussel, che quasi non ha superato la recensione, è una buona aggiunta, ma è così significativo che avrebbe potuto essere pubblicato come proprio post (che ti avrebbe procurato un rappresentante). Molte buone risposte sono buone :)
Kent Fredric,

2
E controllo del codice sorgente? In che modo questo si traduce in altre persone che clonano e creano un progetto che necessita dell'ambiente. var.s?
CpILL,

44

Puoi provare:

export ENVVAR=value

in virtualenv_root / bin / activ. Fondamentalmente lo script di attivazione è ciò che viene eseguito quando inizi a utilizzare virtualenv in modo da poter inserire tutta la tua personalizzazione.


2
Non sono sicuro che sia abbastanza pulito ma funzioni definitivamente!
Chachan,

2
Sì, è economico e cattivo, ma a volte è quello che ti serve.
Michael Scheper,

1
Non lo consiglio, l'ho fatto e qualche tempo dopo tutti gli script activ (activ, activ.csh, activ.fish) sono stati sovrascritti automaticamente, quindi ho perso la modifica. Usa postattivazione e pre-attivazione.
Wil93,

non usare spazi attorno al =
Rik Schoonbeek

Potrebbe anche aggiungere 'unset ENVVAR' nella deactivatefunzione definita virtualenv_root / bin / activ to balance setting and unsetting
Lou Zell

42

Usando solo virtualenv (senza virtualenvwrapper ), impostare le variabili di ambiente è facile attraverso lo activatescript che si sta procurando per attivare virtualenv.

Correre:

nano YOUR_ENV/bin/activate

Aggiungi le variabili di ambiente alla fine del file in questo modo:

export KEY=VALUE

Puoi anche impostare un hook simile per disinserire la variabile d'ambiente come suggerito da Danilo Bargen nella sua ottima risposta sopra, se necessario.


9
un approccio molto più sano dell'IMO. scavalcando cdsolo per avere variabili d'ambiente? brivido
Michel Müller,

che ne dici della pulizia dopo la disattivazione?
buncis,

36

Mentre ci sono molte belle risposte qui, non ho visto una soluzione pubblicata che includa entrambe le variabili di ambiente disabilitanti su disattivato e non richieda ulteriori librerie oltre virtualenv, quindi ecco la mia soluzione che prevede solo la modifica / bin / activ, usando il variabili MY_SERVER_NAMEe MY_DATABASE_URLcome esempi:

Dovrebbe esserci una definizione per disattivare nello script activ e alla fine di essa vuoi disinserire le variabili:

deactivate () {
    ...

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

Quindi alla fine dello script activ, imposta le variabili:

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

In questo modo non è necessario installare nient'altro per farlo funzionare e non si finisce con le variabili che vengono lasciate quando si deactivatevirtualenv.


3
Mi piace questo approccio perché non voglio lib o app esterne ma il problema è che se ricostruisci l'ambiente perderai tutte le tue impostazioni.
VStoykov,

2
Il vantaggio di questo approccio è la velocità di installazione e la mancanza di magia. Mantenere le variabili di ambiente fuori dal controllo del codice sorgente ti riporterà sempre al problema di distruggere potenzialmente i tuoi segreti / impostazioni durante la ricostruzione degli ambienti.
Anthony Manning-Franklin,

La directory virtualenv finisce per essere controllata nel repository affinché funzioni? Cosa succede se le variabili contengono segreti che non si desidera nel repository? Come lo gestiresti?
frana

2
Non vedo davvero perché sarebbe una buona idea includere un virtualenv nel tuo repository, in quanto non sono molto portabili, ma immagino che potresti mettere le tue esportazioni in un file separato anziché lo script di attivazione e sorgente il file se è presente e non aggiungere quel file al tuo repository.
TheLetterN

18

A livello locale all'interno di virtualenv ci sono due metodi che è possibile utilizzare per testarlo. Il primo è uno strumento che viene installato tramite la cintura degli strumenti Heroku (https://toolbelt.heroku.com/). Lo strumento è caposquadra. Esporterà tutte le variabili di ambiente archiviate in un file .env localmente e quindi eseguirà i processi delle app all'interno di Procfile.

Il secondo modo se stai cercando un approccio più leggero è avere un file .env localmente quindi eseguire:

export $(cat .env)

6

Installa autoenv o di

$ pip install autoenv

(o)

$ brew install autoenv

E quindi creare il .envfile nella cartella del progetto virtualenv

$ echo "source bin/activate" > .env

Ora tutto funziona bene.


3

Se stai già utilizzando Heroku, considera di eseguire il tuo server tramite Foreman . Supporta un .envfile che è semplicemente un elenco di righe KEY=VALche verranno esportate nella tua app prima che venga eseguita.



1

Per attivare virtualenv nella envdirectory ed esportare le variabili envinroment memorizzate in .envuso:

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

salvare agli alias conecho 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
Daniil Mashkin il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.