2016-08-28 6 views
0

python2.7でメモリから直接ファイルを読み込むためのインポートフックを作成できました。しかしpypyのインポートフック(カスタムモジュールローダー)が動作しない

python:Import module from memory

;:私が使用した例では、この質問に受け入れられた応答でしたこのコードをpypyに適用すると、私はインポートエラーが発生します。私はまた、このような、pypyではない通常のPythonで動作しますが、他の輸入フックの例を試してみました:

python load zip with modules from memory

輸入フックがpypyでは動作しない理由を誰もが知っていますか?私が紛失しているものはありますか?

答えて

1

問題点は、両方の例で、load_module()はロードされたモジュールをsys.modulesに追加しないことです。通常、そうする必要があります(そして、PyPyはCPythonのように動作します)。

がモジュールを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

うわー、ありがとう!非常に参考になる – efel

+0

また、あなたが引用した2つの例は、CPython 3.xでは動作しません: '' File "<" importlib._bootstrap> "' 'の内部のどこかからわかりにくいKeyErrorを与えます。 –

関連する問題