The problem is that in both of the examples you point to, load_module()
does not add the loaded module to sys.modules
. Normally, it should do so (and then PyPy works like CPython).
If load_module()
does not add the module to sys.modules
, then every single import a
will call load_module()
again and return a new copy of the module. For example, in the example from 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
This is documented in https://www.python.org/dev/peps/pep-0302/#id27. The load_module()
method is responsible for doing more checks than these simple examples show. In particular, note this line (emphasis in the original):
Note that the module object must be in sys.modules before the loader executes the module code.
So, the fact that PyPy behaves differently than CPython in this case could be understood as a behavior difference that follows from code that fails to respect the docs.
But anyway, my opinion is that it should be fixed. I've created an issue at https://bitbucket.org/pypy/pypy/issues/2382/sysmeta_path-not-working-like-cpythons.