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 Имейте в виду, что переменные окружения переопределяют все параметры во всех разделах с одинаковыми именами. В зависимости от контекста, в котором работает приложение, это может иметь отношение к безопасности.

Другие вопросы по тегам