pypy 的导入挂钩(自定义模块加载器)不起作用
import hooks (custom module loaders) for pypy do not work
我已成功创建导入挂钩以直接从 python2.7 中的内存加载文件。我使用的例子是对这个问题的公认回答:
python:Import module from memory
但是;在 pypy 上应用此代码时;我收到导入错误。我还尝试了其他使用常规 python 但不适用于 pypy 的导入挂钩示例,例如:
有谁知道为什么导入钩子在 pypy 中不起作用?有什么我想念的吗?
问题是在您指向的两个示例中,load_module()
没有将加载的模块添加到 sys.modules
。通常,它应该这样做(然后 PyPy 像 CPython 一样工作)。
如果 load_module()
没有将模块添加到 sys.modules
,那么每个 import a
将再次调用 load_module()
并且 return 一个新的副本模块。例如,在来自 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()
方法负责执行比这些简单示例显示的更多的检查。特别要注意这一行(强调原文):
Note that the module object must be in sys.modules before the loader executes the module code.
因此,在这种情况下,PyPy 的行为与 CPython 不同这一事实可以理解为不遵守文档的代码所导致的行为差异。
但无论如何,我的意见是应该修复它。我在 https://bitbucket.org/pypy/pypy/issues/2382/sysmeta_path-not-working-like-cpythons.
创建了一个问题
我已成功创建导入挂钩以直接从 python2.7 中的内存加载文件。我使用的例子是对这个问题的公认回答:
python:Import module from memory
但是;在 pypy 上应用此代码时;我收到导入错误。我还尝试了其他使用常规 python 但不适用于 pypy 的导入挂钩示例,例如:
有谁知道为什么导入钩子在 pypy 中不起作用?有什么我想念的吗?
问题是在您指向的两个示例中,load_module()
没有将加载的模块添加到 sys.modules
。通常,它应该这样做(然后 PyPy 像 CPython 一样工作)。
如果 load_module()
没有将模块添加到 sys.modules
,那么每个 import a
将再次调用 load_module()
并且 return 一个新的副本模块。例如,在来自 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()
方法负责执行比这些简单示例显示的更多的检查。特别要注意这一行(强调原文):
Note that the module object must be in sys.modules before the loader executes the module code.
因此,在这种情况下,PyPy 的行为与 CPython 不同这一事实可以理解为不遵守文档的代码所导致的行为差异。
但无论如何,我的意见是应该修复它。我在 https://bitbucket.org/pypy/pypy/issues/2382/sysmeta_path-not-working-like-cpythons.
创建了一个问题