代码之家  ›  专栏  ›  技术社区  ›  João Portela

python单个配置文件

  •  21
  • João Portela  · 技术社区  · 16 年前

    我正在开发一个项目,它需要一个数据被多个模块使用的配置文件。
    我的问题是:通常的做法是什么?我应该从每个 我的模块(文件)或有其他方法吗?

    我想有一个名为config.py的模块来读取配置文件,每当我需要配置时我都会读取 import config 然后做一些类似的事情 config.data['teamsdir'] 得到 'teamsdir' 属性(例如)。

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

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

    接受的答案 :选择“Alex Martelli”响应,因为它是最完整的。投票选出其他的答案,因为它们也有好的和有用的地方。

    4 回复  |  直到 16 年前
        1
  •  10
  •   Alex Martelli    16 年前

    我喜欢单人间 config.py 其主体(第一次导入时)解析一个或多个配置数据文件并适当设置自己的“全局变量”的模块——尽管我倾向于 config.teamdata 在周围 config.data['teamdata'] 方法。

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

    “一个或多个”配置文件(例如 /etc 对于常规默认设置,则在 /usr/local 对于特定于站点的覆盖,用户主目录中的一个(对于特定于用户的设置)是一个常见而有用的模式。

        2
  •  4
  •   Otto Allmendinger    16 年前

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

        3
  •  3
  •   Ber    16 年前

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

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

        4
  •  1
  •   sharjeel    16 年前

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