Python:如何处理libs的配置文件(依赖项)

时间:2014-05-24 18:44:12

标签: python environment-variables setuptools

背景:

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

D1D2是独立的库(也是我开发的),应该通过setuptools安装。 P1是主要项目,取决于D1D2。库D1D2需要配置文件才能设置一些自定义参数 - 请说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世界,我们通常这样做)。

1 个答案:

答案 0 :(得分:0)

我不知道Python是怎么回事,但这就是我做的。在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模块并将它们放到该模块中,所以我可以将它们作为Helper.get_config_dir()从我的项目P1中完成。

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')

我认为这种方法比处理env变量更好。