Проблема в том, что в обоих примерах, на которые вы указываете, 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.
Wow thanks! Очень полезно – efel
Кроме того, обратите внимание, что два примера, которые вы цитируете, не работают в CPython 3.x: они дают вам неясный KeyError где-то во внутренних файлах '' File ' "' ' –