Centos Python 3: ConfigParser с использованием переменных среды и перекрестных ссылок
Когда я пытаюсь получить значения с помощью ConfigParser,
Я не могу получить определенные значения из переменных окружения в моем файле.ini
Интерполирующие имена переменных - это печатаемые переменные без замены значения.
Ниже мой код,
config_parse.py:
import os
import configparser
myConf = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
myConf.read('config_data.ini')
print( myConf.get('server_details', 'hostName', vars=os.environ))
print( myConf.get('server_details', 'userName', vars=os.environ))
print( myConf.get('log_path', 'mntPath', vars=os.environ))
exit(0)
config_data.ini:
[server_details]
hostName: %(HOSTNAME)
; Below value are not getting substituted from environment variable
userName: %(USER)
password: passw0rd
[log_path]
instance: %(SERVER_INSTANCE)
mntPath: /net/server1/mnt/data0
; server_details:hostname and instance values are not getting substituted
testbedMntPath: ${mntPath}/${server_details:userName}/my_logs/${server_details:hostName}${instance}
Я получаю следующий вывод,
$] python config_parse.py
сервер1
% (USER)
/ Нетто /server1/ мнт / DATA0 /% (USER) / my_logs /% (HOSTNAME)% (SERVER_INSTANCE)
$]
1 ответ
Вы используете ExtendedInterpolation
, который использует ${section:option}
синтаксис.
Причина, по которой вы получаете server1
за myConf.get('server_details', 'hostName', vars=os.environ)
не потому что hostName = %(HOSTNAME)
интерполируется, но потому что HOSTNAME
от vars
имеет приоритет.
Это проще увидеть на примере:
>>> myConf.get('server_details', 'foo', vars={'FOO': 'BAR'})
'BAR'
Если vars
содержит запись для FOO
, get
звать foo
(без учета регистра) вернет свое значение, значение из файла конфигурации фактически игнорируется.
Так что это означает, что для hostName
вы на самом деле получите значение HOSTNAME
переменная окружения. userName
не существует в os.environ
, так что вы получите значение из файла конфигурации: %(USER)
,
Так что если вы используете ExtendedInterpolations, используйте ${...}
стиль, если вы используете BasicInterpolation использовать %(...)s
стиль. Вы не можете смешать оба. И если вы проходите вслепую vars=os.environ
Имейте в виду, что переменные окружения переопределяют все параметры во всех разделах с одинаковыми именами. В зависимости от контекста, в котором работает приложение, это может иметь отношение к безопасности.