と多少似たようなアプローチで、import hooksからsys.meta_path
まで設定しようとしています。このためには、上のリンクで説明したように、2つの関数find_module
とload_module
を定義する必要があります。PyQt4.QtCoreのインポートフック
name = "QtCore"
path = ['/usr/lib64/python2.7/site-packages/PyQt4']
mod = load_module(name, path)
返し、
Traceback (most recent call last):
File "test.py", line 19, in <module>
mod = load_module(name, path)
File "test.py", line 13, in load_module
module = imp.load_module(name, fp, pathname, description)
SystemError: dynamic module not initialized properly
同じコードの作品:ここではほとんどのモジュールのため正常に動作しますが、Pythonの2.7を使用している場合PyQt4.QtCore
のために失敗した私のload_module
機能、
import imp
def load_module(name, path):
fp, pathname, description = imp.find_module(name, path)
try:
module = imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
return module
ですPython 3.4では問題ありませんが(imp
は廃止予定ですが、代わりにimportlib
が理想的です)。
これは、SIPダイナミックモジュールの初期化と関係があると思います。 Python 2.7を試してみるべきことはありますか?
注:これはPyQt4
とPyQt5
の両方に適用されます。
編集は:これは確かとしてthis questionに関連している可能性があり、
cd /usr/lib64/python2.7/site-packages/PyQt4
python2 -c 'import QtCore'
は同じエラーで失敗します。それでも私は...
EDIT2それを回避する方法がどうなるかわからない。具体的な使用例について@Nikitaの要求に従って、私は何をしようとしていることは、インポートをリダイレクトすることですですので、import A
を実行すると、何が起こるのでしょうかimport B
です。これについては、find_spec/find_module
でモジュールの名前を変更してから、デフォルトのload_module
を使用すれば十分でしょう。しかし、Python 2でデフォルトのload_module
実装がどこにあるのかは不明です。私が見つけた最も近い実装はfuture.standard_library.RenameImport
です。 2.
importlib
の完全な実装のバックポート
再現し、この問題は、このgistで見つけることができますインポートフックのための最小限の作業例があるようにそれは見えません。
それは、有用であるかもしれない私が何をしようとしているため、いくつかの一般的な文脈を与えるために、[SiQt](https://github.com/rth/SiQt)パッケージを見て、この問題がある場合[このgithub問題](https://github.com/rth/SiQt/issues/4)で議論されています。 – rth
私はあなたの問題を本当に理解できませんが、 '__import __( 'PyQt4.QtCore')'の何が間違っていますか。それは無限再帰につながるのだろうか? – danidee
@danidee '__import __( 'A')'には何も問題はありませんが、 'import A'を使うのと同じです。私が望むのは、あなたがそれをするときに起こることを変え、特に 'import A 'を実行するときに' import B'を実行することです。これは 'sys.meta_path'のインポートフックで行うことができますが、' imp.load_module'のようなより低いレベルの関数を必要とします。 – rth