2017-01-27 364 views
2

我想讀取一些環境變量到我的ConfigParser文件中。Python配置解析器環境變量

我指的是this answer但我正在逐漸

"InterpolationDepthError: Value interpolation too deeply recursive" error. 
section: [amazon] 
    option : amazon_access_key 
    rawval : %(AMAZON_ACCESS_KEY)s 

這裏是我的配置文件的一部分:

[amazon] 
amazon_access_key=%(AMAZON_ACCESS_KEY)s 
amazon_secret_key=%(AMAZON_SECRET_KEY)s 

而這就是我寫調用文件:

from ConfigParser import SafeConfigParser 
import os 

config = SafeConfigParser(os.environ) 
config.read('config.txt') 

當我在「亞馬遜」部分直接調用這些變量時,我得到上述錯誤。

當我所說的 「默認」 部分中這些變量,如:

[default] 
aws_access_key=%(AMAZON_ACCESS_KEY)s 
aws_secret_key=%(AMAZON_SECRET_KEY)s 

[amazon] 
    amazon_access_key=%(aws_access_key)s 
    amazon_secret_key=%(aws_secret_key)s 

我得到以下錯誤:

ConfigParser.InterpolationMissingOptionError: Bad value substitution: 
    section: [amazon] 
    option : amazon_access_key 
    key : aws_access_key 
    rawval : %(aws_access_key)s 

缺少什麼我在這裏?

另外,如何爲本地和生產部署分別配置文件?目前,所有配置對於本地和生產環境都是相同的。

+1

你嘗試使用環境變量名不遮蔽原始密鑰?你也可能想看看'[amazon]'部分下的選項卡是否有問題。 –

+0

[amazon]部分下沒有選項卡。 –

回答

1
from ConfigParser import SafeConfigParser 
import ConfigParser 
import os 
class CaseConfigParser(SafeConfigParser): 
    def optionxform(self, optionstr): 
     return optionstr 
config = CaseConfigParser(os.environ) 
config.read('config.ini') 
print config.get('amazon', 'amazon_access_key') 

說明: 的這裏的問題是與optionxform,果然所有的選項,以降低默認的情況下。最終,它將具有與以下類似的關鍵和價值。

[amazon] 
amazon_access_key=%(amazon_access_key)s 

另一個解決方案可以是 - 在config.txt中更改鍵的名稱不等於env vars。

[amazon] 
aak=%(AMAZON_ACCESS_KEY)s 

然後

config = SafeConfigParser(os.environ) 
config.read('config.ini') 
print config.get('amazon', 'aak') 
+0

因此,如果我更改密鑰的名稱,這仍然工作?在這種情況下,我不需要創建另一個班級。我想避免這種情況,因爲我必須在多個其他文件中調用此配置文件。 –

+0

可能是一個猴子補丁'SafeConfigParser.optionxform = lambda self,st:st' –

+0

非常感謝,更改關鍵名稱的確有訣竅..:D –

-1

您應該記住,默認部分應該大寫。

[DEFAULT] 

進行此更改應該可以解決問題。

+0

更改爲[DEFAULT]沒有幫助。我仍然InterpolationMissingOptionError –