给定这样的项目结构:
my_project/
__init__.py
config.json
utils/
__init__.py
config_manager.py
foo/
__init__.py
foo.py
bar/
__init__.py
bar.py
baz/
__init__.py
baz.py
quux/
__init__.py
quux.py
我在config_manager.py
中有一个函数,它接受配置文件的可选路径,但默认使用my_project/config.json
。该函数应该是与配置交互的唯一方式 - 调用它,获取配置,提取所需的任何内容。我希望能够从任何地方使用配置运行代码,例如,不仅仅是从顶级目录,并让它“正常工作”。
我可以破解像
这样的东西# config_manager.py
def get_config(config_path=None):
if config_path is None:
cdir = os.path.dirname(__file__)
config_path = os.path.join(cdir, '..', 'config.json')
...
但这很脆弱(如果config.json
或config_manager.py
的位置发生变化会怎样?)并且很难看。处理这种情况的任何模式/提示/建议/做法?
(我确信我不是第一个对此感到疑惑的人,谷歌很难。)
答案 0 :(得分:1)
我的建议就是打包你需要的一切。
例如,您可以将此类内容添加到setup.py
...
package_data={'mypackage': ['*.json']},
...
然后在您的代码中,您将能够执行以下访问配置:
from pkg_resources import resource_stream
config_file = resource_stream(__name__, 'config.json')
答案 1 :(得分:0)
这就是我们在大多数操作系统中维护PATH变量的原因:告诉我们应该在哪里搜索东西。查找路径功能;它可能就是你所需要的。
根据您考虑的用户模型(从发布中不完全清楚),您可能希望使用os.walk()来搜索给定目录下的文件。