使用脚本中的包文件

时间:2013-10-25 22:49:53

标签: python package distutils

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

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

2 个答案:

答案 0 :(得分:5)

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

pkgutil模块,特别是get_data函数,是获取数据包文件内容的stdlib方法。

请参阅Installing Package DataInstalling 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的答案。