我正在实现一个导入钩子,它使用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())
答案 0 :(得分:2)
如果替换__import__
,则会获得模块导入的模块全局变量以及更多信息。