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