我应该如何处理包裹所需的数据?
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
包文件的文件。
我有一个 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
包文件的文件。