背景:
我目前正在开发一个由3个不同的Python项目组成的产品:P1
,D1
,D2
。
D1
和D2
是独立的库(也是我开发的),应该通过setuptools
安装。 P1
是主要项目,取决于D1
和D2
。库D1
和D2
需要配置文件才能设置一些自定义参数 - 请说config_d1.json
和config_d2.json
。
问题:
由于P1
需要自定义D1
和D2
的配置,我想知道设置这些文件位置的最佳方法。
当前解决方案:
我正在考虑使用环境变量D1_CONF_HOME
和D2_CONF_HOME
以及D1
和D2
内部来设置配置文件的位置
D1_CONF_HOME = os.getenv('D1_CONF_HOME', '')
SETTINGS_LOCATION = path.join(D1_CONF_HOME, 'config_d1.json')
但我想知道它是否真的是Pythonic的方式(我来自Java世界,我们通常这样做)。
答案 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变量更好。