【问题标题】:Python: How to deal with config files of libs (dependencies)Python:如何处理库的配置文件(依赖项)
【发布时间】:2014-05-24 18:44:11
【问题描述】:

上下文:

我目前正在开发一个由 3 个不同的 Python 项目组成的产品:P1D1D2

D1D2 是独立的库(也是我开发的),应该通过setuptools 安装。 P1 是主要项目,它依赖于D1D2D1D2 库需要配置文件才能设置一些自定义参数 - 比如 config_d1.jsonconfig_d2.json

问题:

由于P1需要自定义D1D2的配置,我想知道设置这些文件位置的最佳方式。

当前解决方案:

我正在考虑通过使用环境变量为D1_CONF_HOMED2_CONF_HOME 以及在D1D2 内部执行类似的操作来设置配置文件的位置

D1_CONF_HOME = os.getenv('D1_CONF_HOME', '')
SETTINGS_LOCATION = path.join(D1_CONF_HOME, 'config_d1.json')

但我想知道这是否真的是 Pythonic 的方式(我来自 Java 世界,我们通常这样做)。

【问题讨论】:

    标签: python environment-variables setuptools


    【解决方案1】:

    我不知道它是如何 Pythonian 的,但我就是这样做的。在 setup.py 我有:

    setup(name='pkg-name',
         ...
         packages=['pkg-name'],
         package_dir={'pkg-name':'pkg-dir'},
         package_data={'pkg-name':['config/cfg1.json', 'config/cfg1.json']},
         ...
    

    请注意,“config”是您项目中“pkg-dir”的子文件夹。

    您需要做的最后一件事是编写能够找到包和配置路径的函数。这些函数在您在库中实现时才起作用,而不是在您的项目 P1 中。在我的例子中,我在我的 lib 中创建了一个 Helper 模块并将它们放入该模块,所以我可以将我的项目 P1 中的所有它们作为 Helper.get_config_dir()。

    def get_pkg_dir():
      f = __file__
      for _ in range(100)
        f = os.path.abspath(os.path.dirname(f))
        if re.search(r'pkg-name$', f) is not None:
          break;
      return f
    
    def get_config_dir():
      return os.path.abspath(os.path.join(get_pkg_dir(), 'config')
    

    我认为这种方法比处理环境变量要好。

    【讨论】:

    • 有趣的解决方案。感谢您的意见,@Oleg。我想知道P1 如何让一个新的配置文件——比如cfg2.json——对你的库模块可见。
    • 当您在运行时可以访问您的配置目录时,您可以即时创建或修改配置文件。对吗?
    • 好吧,我想做的是在库中有一个默认配置文件,并且能够在必要时指定另一个配置文件。我没想到要更改库中的默认配置文件。这是你的建议吗?
    • 这也是我的目标——拥有一个我可以在我的项目中创建的默认 JSON 配置,然后在正常设置过程中使用 setuptools 将其安装到包目录中,因此这部分已解决.如果通过“指定”另一个您的意思是动态创建它,那么您也可以通过在 P1 项目的 lib 包目录中创建一个新文件来实现。
    • 哦,我明白了。这是一种公平的做法。我只是不知道我们是否应该在 lib 的文件夹中添加文件。以我为例,D1D2 安装在普通用户没有写权限的地方。
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2012-01-08
    • 2014-10-22
    • 2011-11-19
    相关资源
    最近更新 更多