17.2.6.9 包数据
除了定义API来加载可执行的Pyhton代码,PEP 302还定义了一个可选的API以获取包数据,用于发布数据文件、文档和包所需的其他非代码资源。通过实现get_data()。加载工具允许调用应用以获取与包关联的数据,而不用考虑这个包具体如何安装(特别是不用假设这个包作为文件存储在一个文件系统上)。
import sys
import sys_shelve_importer
import os
import pkgutil
filename = '/tmp/pymotw_import_example.shelve'
sys.path_hooks.append(sys_shelve_importer.ShelveFinder)
sys.path.insert(0,filename)
import package
readme_path = os.path.join(package.__path__[0],'README')
readme = pkgutil.get_data('package','README')
# Equivalent to:
# readme = package.__loader__.get_data(readme_path)
print(readme.decode('utf-8'))
foo_path = os.path.join(package.__path[0],'foo')
try:
foo = pkgutil.get_data('package','foo')
# Equivalent to:
# foo = package.__loader__.get_data(foo_path)
except IOError as err:
print('ERROR: Could not load "foo"',err)
else:
print(foo)
get_data()根据拥有数据的模块或包来取一个路径。它将资源"文件"的内容作为一个字节串返回,或者如果这个资源不存在,则产生一个IOError。