2013-07-29 74 views
0

我的脚本应该被称为像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 

正如你可以看到我的config文件中,在我的模块ConfigReader.py硬编码。 如何将我的var ConfigFile传递到我的模块中?

这只是一个简单的例子。我有一堆应该访问这个变量的文件。

是一个全局变量的选择吗?有另一种方法吗?

+0

使用一个'load_configuration()'函数,它的文件名作为参数。 –

+0

我不确定我是否可以关注你。你能简单解释一下吗? –

+0

在您导入并调用的选项模块中创建一个函数,并传递配置文件的文件名。不需要全局变量。 –

回答

0

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 
+0

我不确定。为什么在options.py中导入ConfigFile并不使用它?另外你为什么要在ConfigReader中设置变量ConfigFile? –

+0

@DennyCrane,只是解决方案。提供更好的 - 我会删除这个。 – eri

+0

@DennyCrane,我将它导入到options.py namespase。在另一个文件中使用它。 – eri

0

我找到了一个解决方案给我。

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 
[...]