2015-08-13 15 views
7

Python 2 ile Debian Jessie üzerinde çalışıyorum. Neden Python'un environ'u bash'ta görünen çevre değişkenlerini göremiyor?Python neden çevre değişkenlerini göremiyor?

SECRET_KEY=xxx-xxx-xxx 

Onları görmek bash almak için source /etc/environment çalıştırmak zorunda, ben garip gelmişti: O alakalı emin değil -

# echo $SECRET_KEY 
xxx-xxx-xxxx 
# python 
>>> from os import environ 
>>> environ["SECRET_KEY"] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/root/.virtualenvs/prescribing/lib/python2.7/UserDict.py", line 23, in __getitem__ 
    raise KeyError(key) 
KeyError: 'SECRET_KEY' 

Ben /etc/environment kullanarak bu ortam değişkenleri ayarlayın.

GÜNCELLEME: printenv SECRET_KEY hiçbir şey üretmiyor, bu yüzden SECRET_KEY bir kabuk değil bir ortam değişkeni olduğunu tahmin ediyorum. Çocuk süreçler onları görmek için

+1

Bu bir ortam değişkeni değil; Siz onu ihraç edene kadar sadece bir kabuk değişkeni. –

+0

Gerçekten mi? Ben/env/environment'ın ortam değişkenlerini belirlemek için olduğunu düşündüm - bu yanlış mı? – Richard

+0

'source/env/environment 'işlevini kullanmak, yalnızca kabuktaki değişkenleri ayarlar, alt süreçler tarafından erişilebilen ortam değişkenlerini değil. –

cevap

19

Sen ihracata ortam değişkenleri gerekir:

export SECRET_KEY 

Demo: Bir adımda ayarı ve ihracat birleştirebilirsiniz

$ SECRET_KEY='foobar' 
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')" 
Nonesuch 
$ export SECRET_KEY 
$ bin/python -c "import os; print os.environ.get('SECRET_KEY', 'Nonesuch')" 
foobar 

:

export SECRET_KEY=xxx-xxx-xxxx 

/etc/environment'daki yeni değişkenler, yeni oturum açma'a sahip olduğunuz sürece otomatik olarak mevcut kabuklarınızda görünmeyeceğini unutmayın. Bir GUI masaüstünde oturum açmak ve tekrar giriş yapmak zorunda kalacaksınız, SSH oturumları için yeni bir SSH girişi oluşturmanız gerekecektir. Ancak o zaman, mevcut değişikliklerle yeni bir süreç ağacı elde edeceksiniz. source /etc/environment'u kullanarak sadece 'local' değişkenlerini ayarlar (dosya bir betik değildir). Süper Kullanıcı üzerinde How to reload /etc/environment without rebooting?'a bakın.

+0

https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fenvironment içindeki talimatları takip etmeye çalışıyordum -/etc/environment içinde 'foo = bar' yerine' export foo-bar 'kullanmalı mıyım? ? – Richard

+0

Bu, o kadar önemli değil.çevre 'sadece os' modülünün ilk alındığı anda yüklenir. Yani bir bash betiği yürütmek için bir 'altişlem' olarak adlandırırsanız, python betiğine döndüğünde bash komut dosyanızda dışa aktarılabilecek yeni ortam değişkenlerini göremezsiniz. – amza

+1

@Richard: Sorunuzda '/ env/environment' ismini verdiniz,/etc/environment' değil. * Ben * bu Ubuntu ile tanıdık, işletim sisteminin nasıl kullanıldığına bir göz atacağım o. Dosyada değişiklik yaptıktan sonra yeniden başlattınız mı? –

İlgili konular