2017-01-27 17 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 

Вот часть моего файла конфигурации:

[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

переход на [ПО УМОЛЧАНИЮ] не помог. Я все еще получаю InterpolationMissingOptionError –