2017-01-27 41 views
2

ConfigParserファイルにいくつかの環境変数を読み込もうとしています。Python Config Parser環境変数

私はthis answerに言及していたが、私はここで

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

を取得していますが、私のconfigファイルの一部です:

[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') 

これらの変数を「amazon」セクションで直接呼び出すと、上記のエラー。

私は "デフォルト" セクションでこれらの変数を呼び出し、のような:

[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 

もう1つの解決方法は、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を取得しています –