【问题标题】:Getting full module name in Import hook在导入挂钩中获取完整的模块名称
【发布时间】:2013-10-25 18:06:30
【问题描述】:

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

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

知道如何在导入时获取完整模块的名称吗?

这里有一些代码:

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())

【问题讨论】:

  • 哎呀,糟糕的主意。不要自动安装;如果有版本不兼容怎么办?
  • 别担心@MartijnPieters!我向你保证,应用程序的其余部分更加不安全:P 这只是为了好玩。
  • 如果您替换 __import__,那么您将获得模块导入的模块全局变量以及更多信息。
  • 感谢@User!那成功了。你想写一个答案让我接受吗?如果没有,我就自己写一个。
  • 我写了一个答案,但如果你在你的答案中发布你的代码会很好。

标签: python import path hook


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 2012-07-27
  • 2013-09-27
  • 1970-01-01
  • 2013-11-06
  • 2016-08-27
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多