2016-08-21 81 views
3

我的配置文件格式爲json某些格式爲yaml。我想能夠讀取那些帶有環境變量值的配置文件。例如:Ruby的ERB like功能python

{"username":"Dan", "password":"<%= ENV['DB_PASSWORD']%>"} 

這意味着加載從環境變量JSON文件,並用具體的值替換<%= ENV['DB_PASSWORD']%>當密碼被檢索。

注:1。上面提到的語法就像它正在使用ruby的erb僅用於說明 2.我更喜歡本地python解決方案而不安裝新的python包,但如果沒有這樣的話,我也會接受這一點。

回答

1

你正在尋找的是俗稱模板什麼,你已經基本定義的模板語言

取決於你想要做什麼正好你可以使用stdlib中的string.Template庫。不過,它只做簡單的變量替換,與ERb相反,它允許任意代碼(包括刪除所有數據,格式化硬盤,啓動後門...的代碼)。

所以,string.Template既是比ERb的那麼強大,也安全。你的例子已經證明了這一點,因爲你甚至不能從模板中訪問環境變量,你必須明確地傳遞它們。

這是基本用法:

from string import Template 

s = Template('{"username": "Dan", "password": "$db_password"}') 

s.safe_substitute(db_password = 's00persekrit') 
# >>> {"username": "Dan", "password": "s00persekrit"} 

由於訪問環境變量是不可能的模板中,你將不得不通過他們明確的模板:

from string import Template 
from os import environ as env 

s = Template('{"username": "Dan", "password": "$db_password"}') 

s.safe_substitute(db_password = env['DB_PASSWORD']) 
# >>> {"username": "Dan", "password": "s00persekrit"} 

其實,如果你想讓模板訪問所有的環境變量,你應該能夠直接傳遞os.environ字典(你可以傳遞任何類似於dict的對象)。

from string import Template 
from os import environ as env 

s = Template('{"username": "Dan", "password": "$DB_PASSWORD"}') 

s.safe_substitute(env) 
# >>> {"username": "Dan", "password": "s00persekrit"} 

如果你想要一些更強大的替代,那麼你應該看看其他一些所謂的「邏輯少」模板語言(即語言只進行簡單的換人,但不允許執行代碼,和唐不允許條件或循環)。其中一種語言是Mustache(GitHub使用的模板語言),有多種語言的實現,包括Pystache for Python

如果您想要/需要更高級的功能,例如循環,條件等,您可能需要尋找更全功能的template languages,如Jinja