Передача файла конфигурации в качестве аргумента модулю разбора конфигурации

Мой скрипт должен называться как thiks:

# python start.py --config=start.cfg

Итак, у меня есть три файла:

start.py

import argparse                                                                 
import options                                                                  

parser = argparse.ArgumentParser(prog='mystart')                                
parser.add_argument("-f", "--file", dest="filename",                            
                    help="write report to FILE", metavar="FILE")                

args = parser.parse_args()                                                      
ConfigFile = args.filename                                                      

test = options.getTest()                                                        

print test

options.py

from ConfigReader import getConfigValue as getVal                               


def getTest():                                                                  
    Test = getVal('main', 'test')                                               
    return Test 

ConfigReader.py

import os                                                                       
import ConfigParser                                                             


def config():                                                                   
    cfg = ConfigParser.ConfigParser()                                           
    for f in ('default.cfg',):                                                  
        if os.path.exists(f):                                                   
            cfg.read(f)                                                         
            return cfg                                                          
    return None                                                                 


def getConfigValue(Section, Option):                                            
    cfg = config()                                                              
    if cfg.has_option(Section, Option):                                         
        return cfg.get(Section, Option)                                         
    else:                                                                       
        return None

Как видите, мой файл конфигурации жестко запрограммирован в моем модуле ConfigReader.py. Как я могу теперь передать свой var ConfigFile в свой модуль?

Это всего лишь простой пример. У меня есть куча файлов, которые также должны обращаться к этой переменной.

Является ли глобальная переменная опцией? Есть ли другой способ?


person Denny Crane    schedule 29.07.2013    source источник
comment
Используйте функцию load_configuration(), которая принимает имя файла в качестве аргумента.   -  person Martijn Pieters    schedule 29.07.2013
comment
Я не уверен, смогу ли я следовать за вами. Не могли бы вы объяснить мне это вкратце?   -  person Denny Crane    schedule 29.07.2013
comment
Создайте функцию в своем модуле параметров, которую вы импортируете и вызываете, передавая имя файла файла конфигурации. Глобальная переменная не требуется.   -  person Martijn Pieters    schedule 29.07.2013
comment
вы можете использовать файл python в качестве конфигурации и просто импортировать его. см.: stackoverflow.com/questions/8225954/   -  person Udy    schedule 29.07.2013
comment
@ Мартин, я понимаю, что ты имеешь в виду. Но мой скрипт содержит много файлов. И я хотел бы добавить это на лету.   -  person Denny Crane    schedule 29.07.2013


Ответы (2)


start.py

...
options.ConfigFile = args.filename
... 

options.py

from ConfigReader import getConfigValue as getVal, ConfigFile                               

def getTest():                                                                  
    Test = getVal('main', 'test')                                               
    return Test 

ConfigReader.py

import os                                                                       
import ConfigParser                                                             

ConfigFile='default.cfg'  
def config():                                                                   
    cfg = ConfigParser.ConfigParser()                                           
    for f in set(['default.cfg',ConfigFile]):                                                  
        if os.path.exists(f):                                                   
            cfg.read(f)                                                         
            return cfg                                                          
    return None                                                                 


def getConfigValue(Section, Option):                                            
    cfg = config()                                                              
    if cfg.has_option(Section, Option):                                         
        return cfg.get(Section, Option)                                         
    else:                                                                       
        return None
person eri    schedule 29.07.2013
comment
Я не уверен. Почему вы импортируете ConfigFile в options.py и не используете его? Также почему вы устанавливаете в ConfigReader переменную ConfigFile? - person Denny Crane; 29.07.2013
comment
@DennyCrane, просто решение. Предоставьте лучше - я удалю это. - person eri; 29.07.2013
comment
@DennyCrane, я импортировал его в пространство имен options.py. Использовал его в другом файле. - person eri; 29.07.2013
comment
Но я не вижу, чтобы вы использовали его в ConfigReader.py: D - person Denny Crane; 29.07.2013
comment
мне не нужно использовать его там. это своего рода взлом импорта модуля Python. - person eri; 29.07.2013

Я нашел решение для себя.

start.py

[...]
import ConfigRader
[...]
ConfigReader.LoadConfigFile(args.filename)

ConfigReader.py

[...]
_ConfigFile = None                                                              
def LoadConfigFile(File):                                                          
    if not File:                                                                
        File = 'default.cfg'                                                    
    global _ConfigFile                                                          
    _ConfigFile = File
[...]
person Denny Crane    schedule 01.08.2013