virtualenv'de ortam değişkeni ayarlama


160

Yapılandırmasını almak için ortam değişkenlerini kullanan bir Heroku projem var, ancak önce uygulamamı yerel olarak test etmek için virtualenv kullanıyorum.

Virtualenv içindeki uzak makinede tanımlanan ortam değişkenlerini ayarlamanın bir yolu var mı?

Yanıtlar:


106

Güncelleme

17 Mayıs 2017 itibariyle autoenv README'si direnv'in muhtemelen daha iyi bir seçenek olduğunu ve autoenv'in artık korunmadığını ima ettiğini belirtiyor.

Eski cevap

Ben tam olarak bunu yapmak için autoenv yazdım:

https://github.com/kennethreitz/autoenv


12
Çok komik gif: D
chachan

3
Sadece FYI .env, bok Heroku'nun en azından tecrübelerime göre oluşturduğu görülüyor . Yani deponuza dahil etmeyin. Uzun süre kullanıcı / autoenv btw büyük fan. Merhaba Kenneth, siz de adamım!
galarant

Bu cevap düzenleme sonrasında hala geçerli mi? Nagasaki45 & TheLetterN
donmuş

288

Virtualenvwrapper kullanıyorsanız (kesinlikle tavsiye ederim), aynı adlara sahip komut dosyalarını kullanarak farklı kancalar (önceden etkinleştirin, postactivate, predeactivate, postdeactivate) tanımlayabilirsiniz $VIRTUAL_ENV/bin/. Postactivate kancaya ihtiyacınız var.

$ 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

Bu yapılandırmayı proje dizininizde tutmak istiyorsanız, proje dizininizden $VIRTUAL_ENV/bin/postactivate .

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

Hatta olabilir sembolik oluşturulmasını otomatikleştirmek kullandığınız her zaman mkvirtualenv .

Devre dışı bırakıldığında temizleme

Bunun kendiliğinden temizlenmeyeceğini unutmayın. Virtualenv'i devre dışı bıraktığınızda, ortam değişkeni devam eder. Simetrik olarak temizlemek için$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

Bunu ortamınızda önceden ayarlanmış olabilecek ortam değişkenleri için kullanırsanız, ayarın, sanal ağdan ayrılırken tamamen ayarlanmamasına neden olacağını unutmayın. Eğer bu olası ise, önceki değeri geçici bir yere kaydedebilirsiniz, sonra devre dışı bırakıldığında tekrar okuyun.

Kurmak:

$ 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

Ölçek:

$ echo $SOME_VAR
banana

$ workon myenv

$ echo $SOME_VAR
apple

$ deactivate

$ echo $SOME_VAR
banana

Sadece bir hassasiyet: yapmak ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivatebenim için işe yaramadı. lntam yol istiyor, bu yüzden yapmalıydımln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
Zoneur

@Zoneur Hangi işletim sistemindesiniz? Linux altında göreli yollar çalışır ln.
Danilo Bargen

@DaniloBargen LinuxMint 3.2.0 kullanıyorum. Bu cevap , lntam yolları sevdiğini söyledi, bu yüzden denedim ve işe yaradı. Ben catgöreceli yolu ile symlink çalıştığımda söyledi No such file or directory.
Zoneur

@ dpwrussel, neredeyse gözden geçirme yoluyla yapmadım, onun iyi bir ek, ama onun kadar önemli (kendi temsilcisi olarak elde olurdu) kendi yazı olarak yapılmış olabilir. İyi cevaplar çok iyi :)
Kent Fredric

2
Peki kaynak kontrolü? Bu, env'ye ihtiyaç duyan bir projeyi klonlayan ve oluşturan diğer insanlara nasıl tercüme edilir. var.s?
CpILL

44

Deneyebilirsiniz:

export ENVVAR=value

virtualenv_root / bin / activ içinde. Temel olarak, etkinleştirme komut dosyası, sanal özelleştirmeyi kullanmaya başladığınızda yürütülen şeydir, böylece tüm özelleştirmenizi oraya koyabilirsiniz.


2
Bu yeterince temiz ama kesinlikle çalışır emin değilim!
chachan

2
Evet, ucuz ve kötü, ama bazen ihtiyacınız olan şey bu.
Michael Scheper

1
Bunu önermiyorum, yaptım ve bir süre sonra tüm etkinleştirilen komut dosyalarının (enable, activ.csh, activ.fish) otomatik olarak üzerine yazıldığından değişiklikimi kaybettim. Pozitifleştirmeyi ve önceden etkinleştirmeyi kullanın.
wil93


Ayrıca, deactivateayar ve ayarlamayı dengelemek için virtualenv_root / bin / enable olarak tanımlanan fonksiyona 'unset ENVVAR' eklenebilir
Lou Zell

42

Yalnızca virtualenv (virtualenvwrapper olmadan ) kullanarak , sanal değişkenleri activateetkinleştirmek için kaynak kodunuz aracılığıyla ortam değişkenlerini ayarlamak kolaydır .

Çalıştırmak:

nano YOUR_ENV/bin/activate

Ortam değişkenlerini dosyanın sonuna şu şekilde ekleyin:

export KEY=VALUE

İhtiyacınız olursa, yukarıdaki büyük cevabında Danilo Bargen tarafından önerilen çevre değişkenini ayarlamak için benzer bir kanca da ayarlayabilirsiniz.


9
çok daha aklı başında bir yaklaşım IMO. ağır basan cdortam değişkenleri de görmekten? titreme
Michel Müller

deaktif sonrası temizlik nasıl olur?
buncis

36

Burada çok güzel cevaplar olsa da, her ikisinin de devre dışı bırakılmasında ayarlanamayan ortam değişkenlerini içeren ve ötesinde ek kütüphaneler gerektirmeyen bir çözüm görmedim virtualenv, işte burada sadece düzenleme / bin / etkinleştirmeyi içeren çözümü kullanıyorum. değişkenler MY_SERVER_NAMEve MY_DATABASE_URLörnekler:

Etkinleştirme komut dosyasında devre dışı bırakma için bir tanım olmalıdır ve sonunda değişkenlerinizin ayarını kaldırmak istiyorsunuz:

deactivate () {
    ...

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

Ardından etkinleştirme komut dosyasının sonunda değişkenleri ayarlayın:

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

Bu şekilde, çalışmasını sağlamak için başka bir şey yüklemenize gerek kalmaz deactivateve sanal ağdayken kalan değişkenlerle sonuçlanmazsınız .


3
Bu yaklaşımı seviyorum çünkü harici kütüphaneler veya uygulamalar istemiyorum ama bununla ilgili sorun, ortamı yeniden oluşturursanız tüm ayarlarınızı kaybedeceğinizdir.
VStoykov

2
Bu yaklaşımın avantajı, kurulum hızı ve sihir eksikliğidir. Ortam değişkenlerini kaynak kontrolünün dışında tutmak, ortamları yeniden oluştururken sizi her zaman sırlarınızı / ayarlarınızı potansiyel olarak yok etme sorununa götürecektir.
Anthony Manning-Franklin

Bunun için virtualenv dizini depoya kontrol ediliyor mu? Değişkenler depoda istemediğiniz sırlara sahipse ne olur? bu işi nasıl halledersin?
fraxture

2
Çok taşınabilir olmadıkları için deponuza bir sanal envant eklemenin neden iyi bir fikir olduğunu gerçekten anlamıyorum, ancak ihracatlarınızı etkinleştirme komut dosyası yerine ayrı bir dosyaya koyabileceğinizi ve mevcut ve bu dosyayı deponuza eklemeyin.
TheLetterN

18

Bir sanal olarak yerel olarak bunu test etmek için kullanabileceğiniz iki yöntem vardır. Birincisi Heroku araç kemeri (https://toolbelt.heroku.com/) aracılığıyla kurulan bir araçtır. Araç ustabaşı. Yerel olarak bir .env dosyasında depolanan tüm ortam değişkenlerinizi dışa aktarır ve ardından Procfile içinde uygulama işlemlerini çalıştırır.

Daha hafif bir yaklaşım arıyorsanız ikinci yol, yerel olarak bir .env dosyasına sahip olmaktır ve çalıştırın:

export $(cat .env)

6

Autoenv'i şu şekilde yükle :

$ pip install autoenv

(veya)

$ brew install autoenv

Ve sonra .envvirtualenv proje klasörünüzde dosya oluşturun

$ echo "source bin/activate" > .env

Şimdi her şey yolunda gidiyor.


3

Zaten Heroku kullanıyorsanız, sunucunuzu Foreman üzerinden çalıştırmayı düşünün . Çalışmadan önce uygulamanıza aktarılacak .envolan satırların bir listesi olan bir dosyayı destekler KEY=VAL.



1

Virtualenv'i envdizinde etkinleştirmek ve .envkullanımda depolanan çevre değişkenlerini dışa aktarmak için:

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

ile takma ad kaydetmekecho 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
Daniil Mashkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.