我正在开发一个项目,需要一个配置文件,其数据由多个模块使用 我的问题是:通用方法是什么?我应该从每个读取配置文件 我的模块(文件)还是有其他方法可以做到吗?
我想有一个名为config.py的模块来读取配置文件,每当我需要配置时,我会import config
然后执行类似config.data['teamsdir']
的操作获取'teamsdir'
属性(例如)。
响应:选择了conf.py方法,因为它模块化,灵活且简单
我可以直接将配置数据放在文件中,后者如果我想从json文件读取一个xml文件或多个源我只需更改conf.py并确保以相同的方式访问数据。 / p>
接受回答:选择“Alex Martelli”回复,因为它是最完整的。投票给其他答案,因为它们也很好,也很有用。
答案 0 :(得分:10)
我喜欢单个config.py
模块的方法,该模块的主体(首次导入时)解析一个或多个配置数据文件并适当地设置自己的“全局变量” - 尽管我赞成{{1在圆形约config.teamdata
方法上。
这假设配置设置在加载后是只读的(可能在单元测试场景中,测试代码将执行其config.data['teamdata']
变量的人为设置以正确执行测试代码) - 它基本上利用模块的本质作为“单例”的最简单的Pythonic形式(当你不需要子类或其他只由类而不是模块支持的特性时)。
“一个或多个”配置文件(例如,config
中的第一个用于一般默认设置,然后在/etc
下用于特定于站点的覆盖,然后可能在用户的主目录中有一个对于用户特定的设置)是一种常见且有用的模式。
答案 1 :(得分:4)
您描述的方法是可以的。如果要添加对用户配置文件的支持,可以使用execfile(os.path.expanduser("~/.yourprogram/config.py"))
。
答案 2 :(得分:3)
一个很好的方法是在应用程序启动时将配置文件解析为Python对象,并将此对象传递给需要访问配置的所有类和模块。
这可以节省大量时间来解析配置。
答案 3 :(得分:1)
如果你想在不同的机器上共享你的配置,你可以将它放在一个Web服务器上并像这样导入:
import urllib2
confstr = urllib2.urlopen("http://yourhost/config.py").read()
exec(confstr)
如果您想跨不同语言共享它,也许您可以使用JSON编码和解析配置:
import urllib2
import simplejson
confstr = urllib2.urlopen("http://yourhost/config.py").read()
config = simplejson.loads(confstr)