2017-02-10 6 views
0

Я пишу симуляционное программное обеспечение, которое должно поддерживать параметры чтения из файла конфигурации или из командной строки. Очень важно иметь возможность отслеживать конфигурацию симуляции, я записываю файл конфигурации в локальный репозиторий git в начале моделирования.Обновление файла конфигурации, написанного на python

Теперь, если у меня есть параметры в командной строке, у них более высокий приоритет, чем в конфигурационном файле. Но я также хочу их совершить. Думаю, я мог бы сохранить объекты python сконфигурированного моделирования, как раз перед его запуском. Но это было бы более элегантно, если бы я мог просто обновить конфигурационный файл с параметрами командной строки перед его выполнением.

Причина, по которой я пишу конфигурационный файл в python, заключается в том, что я должен определить в нем некоторые объекты python. У меня есть что-то вроде

import SomeSimulationClass 
SIMULATOR = SomeSimulationClass 

в моем файле конфигурации и SIMULATOR можно легко обменивать. Если я хочу использовать что-то вроде configparser, у меня не могут быть объекты, которые я считаю.

Есть ли простой способ обновления файла конфигурации python? Все имена переменных в нем уже определены, я просто хочу изменить значения. Единственное, что я могу придумать, это проанализировать файл, сравнивая строки между файлом и параметрами командной строки ...

+0

вы знаете, 'configparser' модуль? использовать это. –

+0

В подобной ситуации я определил все поля моих переменных/объектов в файле конфигурации (ini format). Затем я написал функцию для инициализации всех объектов и переменных в зависимости от прочитанного файла конфигурации, давая значения по умолчанию, когда это необходимо. Требовать некоторые мысли об организации конфигурационного файла. –

ответ

0

Вы можете написать все, что захотите, в файл, а затем позже Configparser может прочитать , используя значения из ваших переменных. Вот пример того, как я использовал Configparser для чтения среды из файла конфигурации.

import os 
from ConfigParser import SafeConfigParser 

conf_filename = os.getenv("CONFIG_FILE") 
src_dir = os.getenv("CONFIG_DIR") 
conf_file = os.path.join(src_dir,conf_filename) 
parser = SafeConfigParser() 
parser.read(conf_file) 
section = env 
server = parser.get(section, 'host') 
db_port = parser.get(section, 'db_port') 
ws_port = parser.get(section, 'ws_port') 

и сам конфигурационный файл:

[PROD] 
host=xxx-yyy-15 
db_port=1521 
ws_port=8280 
ora_server=xxx-xxx-xxx.com 
sid=XXXXX 
userid=xxxx 
passwd=xxxx 
[STAGE] 
host=xxx-yyy-04 
db_port=1521 
ws_port=8280 
ora_server=yyy-yyy-yyy.com 
sid=YYYYYY 
userid=yyyy 
passwd=yyyy 
0

Я нашел способ сделать то, что я хочу. Некоторые небольшие изменения были необходимы для моего модуля конфигурации питона, чтобы позволить ему быть переписано в следующем сценарии, но это работает для моих целей:

with open('merged_config.py', 'w') as merged_config, \ 
      open(base_config_module.__file__, 'r') as base_config: 
     for line in base_config: 
      if 'import' in line: 
       # copy imports from bas config 
       merged_config.write(line) 

     for item in dir(base_config_module): 
      if item.startswith("__"): 
       # ignore __variables like '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__' ... 
       continue 
      if item == 'SimulationSteps': 
       # ingoring my imports 
       continue 

      item_val = getattr(base_config_module, item) 
      # I had to overwrite the __repr__() method of Enums which I used. Everyting else worked fine. 
      merged_config.write('%s = %s\n' % (item, repr(item_val)))