第十七章:运行时特性-sys:系统特定配置-模块和导入-元路径

本文探讨了Python中sys.meta_path的使用,通过自定义元路径导入查找器和加载器,实现模块的灵活导入,无需直接修改sys.path。示例展示了如何创建NoisyMetaImportFinder和NoisyMetaImportLoader,用于特定前缀模块的导入。

17.2.6.11 元路径
sys.meta_path进一步扩展了可能的导入来源,允许在扫描常规的sys.path之前先搜索查找工具。元路径上查找工具的API与常规路径上查找工具的API是一样的,只不过元查找工具不限于sys.path中的一项,它可以搜索任何地方。

import sys
import imp


class NoisyMetaImportFinder:

    def __init__(self,prefix):
        print('Creating NoisyMetaImportFinder for {}'.format(
            prefix))
        self.prefix = prefix
        return

    def find_module(self,fullname,path=None):
        print('looking for {!r} with path {!r}'.format(
            fullname,path))
        name_parts = fullname.split('.')
        if name_parts and name_parts[0] == self.prefix:
            print('... found prefix, returning loader')
            return NoisyMetaImportLoader(path)
        else:
            print('... not the right prefix, cannot load')
        return None


class NoisyMetaImportLoader:

    def __init__(self,path_entry):
        self.path_entry = path_entry
        return

    def load_module(self,fullname):
        print('loading {}'.format(fullname))
        if fullname in sys.modules:
            mod = sys.modules[fullname]
        else:
            mod = sys.modules.setdefault(
                fullname,
                imp.new_module(fullname))

        # Set a few properties required by PEP 302.
        mod.__file__ = fullname
        mod.__name__ = fullname

        # Always looks like a package
        mod.__path__ = ['path-entry-goes-here']
        mod.__loader__ = self
        mod.__package__ = '.'.join(fullname.split('.')[:-1])

        return mod


# Install the meta_path finder.
sys.meta_path.append(NoisyMetaImportFinder('foo'))

# Import some modules that are "found" by the meta-path finder.
print()
import foo

print()
import foo.bar

# Import a module that is not found.
print()
try:
    import bar
except ImportError as e:
    pass

搜索sys.path之前,会询问元路径上的各个查找工具,所以总算可以让一个中心导入工具加载模块,而不必显式地修改sys.path。一旦"找到"模块,加载工具API就会像常规加载工具一样正常工作(不过为简单起见,这个例子有所删减)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值