第十七章:运行时特性-sys:系统特定配置-模块和导入-包数据

本文探讨了PEP302中定义的包数据加载机制,详细介绍了如何使用get_data()方法获取与包关联的数据文件,无论包如何安装。通过实例演示了从包中读取README和尝试加载'foo'文件的过程。

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值