2017-01-27 5 views
2

Ich versuche, einige Umgebungsvariablen in meine ConfigParser-Datei zu lesen.Python Config Parser Umgebungsvariablen

Ich bezog mich auf this answer aber ich bin immer

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

Hier ist der Teil meiner Konfigurationsdatei:

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

Und das ist, was ich schreibe, die Datei zu nennen:

from ConfigParser import SafeConfigParser 
import os 

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

Wenn ich diese Variablen direkt in der "Amazon" -Abschnitt aufrufen, bekomme ich der oben angegebene Fehler.

Wenn ich diese Variablen in der "default" Abschnitt nennen, wie:

[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 

ich die folgende Fehlermeldung erhalten:

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

Was bin ich hier?

Wie kann ich separate Konfigurationsdateien für lokale und Produktionsbereitstellungen haben? Derzeit sind alle Konfigurationen für lokale und Produktionsumgebungen identisch.

+1

haben Sie Umgebungsvariablen versucht verwenden, die den Originalschlüssel nicht Schatten? Vielleicht möchten Sie auch sehen, ob die Tabs unter "[amazon]" wichtig sind. –

+0

Es gibt keine Registerkarten im Abschnitt [amazon]. –

Antwort

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

Erläuterung: Das Problem hier ist mit optionxform, die alle Optionen dreht Fall standardmäßig zu senken. Schließlich wird es Schlüssel und Wert gleich haben, ähnlich wie folgt. Änderung Namen der Tasten in config.txt NICHT gleich env vars -

[amazon] 
amazon_access_key=%(amazon_access_key)s 

kann eine andere Lösung sein.

[amazon] 
aak=%(AMAZON_ACCESS_KEY)s 

und dann

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

Also, wenn ich den Namen des Schlüssels ändern, wird dies noch funktionieren? In diesem Fall muss ich keine andere Klasse erstellen. Ich möchte das vermeiden, weil ich diese Konfigurationsdatei in mehreren anderen Dateien aufrufen muss. –

+0

Wahrscheinlich ein Affe-Patch 'SafeConfigParser.optionxform = Lambda selbst, st: st' –

+0

Vielen Dank, Ändern der Tastennamen hat den Trick ..: D –

-1

Sie sollten daran denken, dass der Standardbereich groß geschrieben werden sollte.

[DEFAULT] 

Durch diese Änderung sollte das Problem behoben werden.

+0

Wechsel zu [DEFAULT] hat nicht geholfen. Ich bekomme immer noch InterpolationMissingOptionError –