python

时间:2015-09-22 19:00:58

标签: python path filesystems python-2.x

给定这样的项目结构:

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.jsonconfig_manager.py的位置发生变化会怎样?)并且很难看。处理这种情况的任何模式/提示/建议/做法?

(我确信我不是第一个对此感到疑惑的人,谷歌很难。)

2 个答案:

答案 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()来搜索给定目录下的文件。