在Import钩子中获取完整的模块名称

时间:2013-10-25 18:06:30

标签: python import path hook

我正在实现一个导入钩子,它使用pip自动安装缺少的模块。

到目前为止,它对简单模块(只有一个级别)工作正常,例如unipath。但是,如果我尝试将其用于多级导入,例如zope.interface,则导入器只会获取第一部分(zope)。这导致它失败,因为PyPI中不存在zope

了解如何在导入时获取完整模块的名称?

这里有一些代码:

class PipLoader(object):
    def __init__(self):
        self.module = None

    def find_module(self, name, path):
        print "Will install module {}".format(name)
        self.module = None
        sys.meta_path.remove(self)
        try:
            pip_install(name)
            self.module = importlib.import_module(name)
        finally:
            sys.meta_path.append(self)
        return self

    def load_module(self, name):
        if not self.module:
            raise ImportError("Unable to load module")
        module = self.module
        sys.modules[name] = module
        return module

def install():
    sys.meta_path.append(PipLoader())

1 个答案:

答案 0 :(得分:2)

如果替换__import__,则会获得模块导入的模块全局变量以及更多信息。