1

如果我的 Python 包中有一个脚本,我怎样才能让它从包中读取其他文件,因为__file__包含(例如)/usr/bin/myscript而不是/usr/lib/python3.3/site-packages/mypackage/myscript

(这些文件只是模板,而不是模块。)

4

2 回答 2

5

基于路径名的任何东西都不起作用,因为您的包或整个站点包可能是一个 zip 文件,或者文件可能已安装在包内以外的其他地方,等等。

pkgutil模块,尤其是get_data函数,是获取作为包一部分的数据文件内容的 stdlib 方法。

请参阅安装包数据安装附加文件以获取有关确保文件实际上最终存在的更多信息。

如果您想使用setuptools而不仅仅是标准库,pkg_resources可以使事情变得更容易/更灵活。

于 2013-10-25T23:07:17.640 回答
3

您可以使用来自'的ResourceManager APIsetuptoolspkg_resources

import pkg_resources
my_stream = pkg_resources.resource_stream(__name__, "foo.dat")

例如,将my.package/my/package/foo.dat作为类文件对象打开my_stream

这适用于普通鸡蛋和带拉链的鸡蛋。但是请注意,这需要setuptools安装。对于仅使用标准库(这是首选)的解决方案,请参阅@abarnert 的答案。

于 2013-10-25T23:08:17.227 回答