相关疑难解决方法(0)

Python中特定于包的导入挂钩

我正在创建一个Python模块,将不同语言/框架提供的API映射到Python.理想情况下,我希望将其作为单个根包提供,该包公开辅助方法,并将该其他框架中的所有命名空间映射到Python包/模块.为方便起见,我们以CLR为例:

import clr.System.Data
import clr.System.Windows.Forms
Run Code Online (Sandbox Code Playgroud)

clr是一个神奇的顶层包,它暴露了CLR命名空间System.DataSystem.Windows.Forms子包/子模块(据我所知,一个包只是一个带有子模块/包的模块;它在其中有其他类型的成员仍然有效).

我已经阅读了PEP-302并编写了一个简单的原型程序,通过安装自定义meta_path钩子实现了类似的效果.该clr模块本身是一个适当的Python模块其中,导入时,套__path__ = [](使其成为一个包,以便import甚至试图为子模块在所有查找),并注册该钩.钩子本身拦截包的全名开始的任何包加载,使用"clr."动态创建新模块imp.new_module(),将其注册sys.modules,并使用pixie dust和rainbows用原始API中的类和方法填充它.这是代码:

clr.py

import sys
import imp

class MyLoader:
    def load_module(self, fullname):
        try:
            return sys.modules[fullname]
        except KeyError:
            pass
        print("--- load ---")
        print(fullname)
        m = imp.new_module(fullname)
        m.__file__ = "clr:" + fullname
        m.__path__ = []
        m.__loader__ = self
        m.speak = lambda: print("I'm " + fullname)
        sys.modules.setdefault(fullname, m)
        return m

class MyFinder:
    def …
Run Code Online (Sandbox Code Playgroud)

python import-hooks

14
推荐指数
1
解决办法
4737
查看次数

标签 统计

import-hooks ×1

python ×1