19.2.1 包导入路径
extend_path()函数可以用来修改搜索路径,并改变从包导入子模块的方式,这样能结合多个不同的目录,使它们就好像是一个目录一样。借助这个函数,可以用包的开发版本覆盖已安装的版本,或者将平台特定的模块与共享模块结合到一个包命名空间。
exted_path()会扫描sys.path来查找目录,其中包括一个子目录,它的的名字基于第二个参数指定的包。这个目录列表与作为第一个参数传入并作为一个列表返回的路径值结合,很适合作为包导入路径。
名为demopkg的示例包中包括两个文件,init.py和shared.py。demopkg1中的__init__.py文件包含print语句,以显示修改前和修改后的搜索路径,强调这两个路径之间的区别。
import pkgutil
import pprint
print('demopkg1.__path__ before:')
pprint.pprint(__path__)
print()
__path__ = pkgutil.extend_path(__path__,__name__)
print('demopkg1.__path__ after:')
pprint.pprint(__path__)
print()
extension目录(包含对应demopkg的特性)还包含另外3个源文件。每个目录层次上都有__init__.py,另外这里还有一个not_shared.py。
下面这个简单的测试程序会导入demopkg1包。
import demopkg1
print('demopkg1 :',demppkg1.__file__)
try:
import demopkg1.shared
except Exception as err:
print('demopkg1.shared : Not found ({})'.format(err))
else:
print('demopkg1.shared :',demopkg1.shared.__file__)
try:
import demopkg1.not_shared
except Exception as err:
print('demopkg1.not_shared: Not found ({})'.format(err))
else:
print('demopkg1.not_shared:',demopkg1.not_shared.__file__)
直接从命令行运行这个测试程序时,找不到not_shared模块。