从PYTHONPATH打开文件

4 投票
2 回答
1842 浏览
提问于 2025-04-16 19:10

在一个程序中,受到Java做事方式的影响,我想从解释器的PYTHONPATH目录中读取一个静态文件(实际上是一个日志配置文件)。我知道我可以这样做:

import foo
a = foo.__path__
conf = open(a[0] + "/logging.conf")

但我不确定这是不是“Python风格”的做法。我该如何分发这个日志配置文件,让我的应用程序不需要外部配置就能读取它呢?

2 个回答

1

这里有一段代码,是根据Nix在上面提到的链接写的,不过采用了更偏向函数式编程的风格:

def search_path(pathname_suffix):
    cands = [os.path.join(d,pathname_suffix) for d in sys.path]
    try:
        return filter(os.path.exists, cands)[0]
    except IndexError:
        return None
1

一般来说,这样做是可以的,不过我不太确定你是否需要 a[0],因为这只会给你路径的第一个字符。你应该使用 os.path.join,而不是直接在后面加一个 /,这样可以确保在不同的操作系统上都能正常工作。你可能还想把路径标准化一下,也就是用 os.path.abspath(os.path.dirname(foo.__path__))。需要注意的是,如果 __path__ 在一个压缩文件里或者使用了其他导入技巧,这种方法就不太管用了,但我觉得你不用太担心这个(在Python的主程序中这样做并不常见,跟Java不一样)。

如果你想支持压缩文件,可以使用 pkg_resources,不过现在这个库有点过时了(在新的 packaging 模块里我没有看到对应的API)。

撰写回答