我应该如何处理包裹所需的数据?

How should I handle data needed for a package?

我有一个 python 包需要数据文件才能工作。 目前我只是使用 open("<filename>",'r') 从中读取数据。

但是,这是否成功取决于当前目录。我觉得有一些方法可以告诉 python 在相对于包源的目录中查找文件,而不是相对于使用包的文件。

对于 JVM 语言,有一个 "resource" 目录,Class.getResource 工作得很好。 python 有一些等价物吗?如果不是,处理这个问题的标准方法是什么?

一个模块通常有一个__file__ 属性,来告诉包来自哪里。例如 re:

>>> import re
>>> re.__file__
'/usr/lib/python3.5/re.py'
>>> os.path.dirname(re.__file__)
'/usr/lib/python3.5'

flask:

>>> import flask
>>> flask.__file__
'/home/foo/.local/lib/python3.5/site-packages/flask/__init__.py'
>>> os.path.dirname(flask.__file__)
'/home/foo/.local/lib/python3.5/site-packages/flask'

然后您可以使用os.path.dirname获取目录,并使用os.path.join将路径与新文件名一起加入。

也就是说你想加载一个相对于re包的文件,你可以使用:

import re
import os

with open(os.path.join(os.path.dirname(re.__file__),'foo.data'),'r') as f:
#                                                    ^ relative pathname
    pass

'foo.data' 这里有一个 相对于 re 包文件的文件。