Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python单一配置文件_Python_Configuration Files - Fatal编程技术网

python单一配置文件

python单一配置文件,python,configuration-files,Python,Configuration Files,我正在开发一个项目,该项目需要一个配置文件,其数据由多个模块使用。 我的问题是:解决这个问题的常用方法是什么?我应该从每个数据库读取配置文件吗 我的模块(文件)或有任何其他方式来做吗 我想用一个名为config.py的模块读取配置文件,每当我需要配置时,我都会执行import config,然后执行类似config.data['teamsdir']的操作,获取'teamsdir'属性(例如) 响应:选择conf.py方法,因为它是模块化、灵活和简单的 我可以直接将配置数据放在文件中,后者如果我想

我正在开发一个项目,该项目需要一个配置文件,其数据由多个模块使用。
我的问题是:解决这个问题的常用方法是什么?我应该从每个数据库读取配置文件吗 我的模块(文件)或有任何其他方式来做吗

我想用一个名为config.py的模块读取配置文件,每当我需要配置时,我都会执行
import config
,然后执行类似
config.data['teamsdir']
的操作,获取
'teamsdir'
属性(例如)

响应:选择conf.py方法,因为它是模块化、灵活和简单的

我可以直接将配置数据放在文件中,后者如果我想从json文件、xml文件或多个源中读取,我只需更改conf.py并确保以相同的方式访问数据


接受答案:选择“Alex Martelli”回答,因为这是最完整的回答。投票选出其他答案,因为它们也很好,也很有用。

你所描述的方法还可以。如果您想添加对用户配置文件的支持,可以使用
execfile(os.path.expanduser(“~/.yourprogram/config.py”)

一种很好的方法是在应用程序启动时将配置文件解析为Python对象,并将此对象传递给需要访问配置的所有类和模块


这可能会节省大量解析配置的时间。

我喜欢单个
config.py
模块的方法,该模块的主体(首次导入时)解析一个或多个配置数据文件,并适当设置自己的“全局变量”——尽管我更喜欢
config.teamdata
而不是
config.data['teamdata']
方法

这假设配置设置在加载后是只读的(单元测试场景除外,在单元测试场景中,测试代码将执行自己的
config
变量的人工设置,以正确地执行测试中的代码)——它基本上利用了模块的性质,将其作为最简单的python形式的“单例”(当然,当您不需要子类化或仅由类而非模块支持的其他功能时)


“一个或多个”配置文件(例如,第一个文件位于
/etc
中的某个位置,用于常规默认设置,然后在
/usr/local
下一个文件用于站点特定的覆盖,然后可能在用户的主目录中一个文件用于用户特定的设置)是一种常见且有用的模式。

如果您想在不同的机器上共享配置,您可以将其放在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)

您的回答意味着配置文件是python源代码。我喜欢并使用这种方法,但必须注意,用户可以将任意python代码放入这些文件中,并在应用程序内部执行。这可能会产生安全问题和其他问题,如无法调试、特定于站点的问题。@Ber:用户拥有所有pythonn要编辑的源代码。为什么要修改配置文件?它们可以更改Python应用程序中的任何内容。“将任意Python代码转换为这些文件”当简单地修改应用程序本身更容易时,这是没有意义的。@如果有人访问了你的配置文件,你已经有麻烦了。而且用户不必知道它是python文件,简单的配置文件仍然可以是
username=“Foo”;password=“Bar”
@S.Lott您可以以编译代码(.pyc/.pyo)的形式交付Python应用程序,因此源代码不必可见。您可以使用访问控制来拒绝对中央系统控制文件的更改。诸如~/.config.py之类的用户配置文件会产生上述安全问题,而另一种配置文件则不会。“永远不要把可以用愚蠢来充分解释的东西归因于恶意。"即使用户不想造成任何伤害,他也可能是无意中这样做的。执行用户提供的任意python代码使这更容易我的意图是避免这种方法,因为传递对象不是很实际…@João Portela这是应用程序的架构问题。我认为最好我理解,但对我来说,这在我的项目上下文中没有多大意义。(+1表示有其他选项)你可以在config.py中放置一个函数来“重载”配置设置。当然,这可能有效,也可能无效,这取决于应用程序如何使用配置模块和全局变量。