如果我的 Python 包中有一个脚本,我怎样才能让它从包中读取其他文件,因为__file__
包含(例如)/usr/bin/myscript
而不是/usr/lib/python3.3/site-packages/mypackage/myscript
?
(这些文件只是模板,而不是模块。)
基于路径名的任何东西都不起作用,因为您的包或整个站点包可能是一个 zip 文件,或者文件可能已安装在包内以外的其他地方,等等。
pkgutil
模块,尤其是get_data
函数,是获取作为包一部分的数据文件内容的 stdlib 方法。
请参阅安装包数据和安装附加文件以获取有关确保文件实际上最终存在的更多信息。
如果您想使用setuptools
而不仅仅是标准库,pkg_resources
可以使事情变得更容易/更灵活。
您可以使用来自'的ResourceManager API:setuptools
pkg_resources
import pkg_resources
my_stream = pkg_resources.resource_stream(__name__, "foo.dat")
例如,将my.package/my/package/foo.dat
作为类文件对象打开my_stream
。
这适用于普通鸡蛋和带拉链的鸡蛋。但是请注意,这需要setuptools
安装。对于仅使用标准库(这是首选)的解决方案,请参阅@abarnert 的答案。