2016-08-28 4 views
0

Я успешно могу создать импортные крюки для загрузки файлов непосредственно из памяти в python2.7. Примером я был приемлемым ответом на этот вопрос:импортные крючки (пользовательские загрузчики модулей) для pypy не работают

python:Import module from memory

Однако; при применении этого кода на pypy; Я получаю ошибку импорта. Я также пробовал другие примеры импорта крючков, которые работают с регулярным питоном, но не с PyPy, например, это:

python load zip with modules from memory

Кто-нибудь знает, почему импортные крючки не работает в PyPy? Есть что-то, чего я не хватает?

ответ

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.

+0

Wow thanks! Очень полезно – efel

+0

Кроме того, обратите внимание, что два примера, которые вы цитируете, не работают в CPython 3.x: они дают вам неясный KeyError где-то во внутренних файлах '' File ' "' ' –

Смежные вопросы