pypy的导入钩子(自定义模块加载器)不起作用

时间:2016-08-28 00:02:29

标签: python pypy

我已经成功地创建了导入挂钩,可以直接从python2.7中的内存加载文件。我使用的例子是对这个问题的公认回答:

python:Import module from memory

然而;在pypy上应用此代码时;我收到导入错误。我还尝试过其他导入钩子示例,它们使用常规python而不是pypy,例如:

python load zip with modules from memory

有谁知道为什么导入钩子在pypy中不起作用?有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

问题在于,在您指向的两个示例中,load_module()未将加载的模块添加到sys.modules。通常,它应该这样做(然后PyPy像CPython一样工作)。

如果load_module()未将模块添加到sys.modules,则每个import a将再次调用load_module()并返回该模块的新副本。例如,在python:Import module from memory的示例中:

import a as a1
import a as a2
print a1 is a2   # False!
a1.foo = "foo"
print a2.foo     # AttributeError

https://www.python.org/dev/peps/pep-0302/#id27中记录了这一点。 load_module()方法负责进行比这些简单示例所示更多的检查。特别要注意这一行(强调原文):

  

请注意,在加载程序执行模块代码之前,模块对象必须在sys.modules中。

因此,在这种情况下PyPy的行为与CPython不同的事实可以被理解为一种行为差异,该行为差异来自不遵守文档的代码。

但无论如何,我认为应该修复它。我在https://bitbucket.org/pypy/pypy/issues/2382/sysmeta_path-not-working-like-cpythons创建了一个问题。