4

、という名前のパッケージがありjiva_tasks、これをcelery経由でインポートしようとしていCELERY_IMPORTSます(celeryconfigの属性を使用します。celeryが使用しているimportステートメントは次のとおりです。

__import__(module, [], [], [''])

奇妙なことに、この構文を使用すると、モジュールは2回インポートされます。1回はasjiva_tasksで、もう1回はas jiva_tasks.(最後にピリオドがあります)です。さて、セロリ空のリストではなくグローバルで渡される可能性は高いですが、これは私には壊れているようです。間違った引数が与えられたとしても__import__、有効なpythonモジュール名ではないものをインポートするのは奇妙に思えます。

これを修正する方法は渡すglobalsことですが、なぜこの結果が得られるのかを理解したいと思います。これはバグですか、それともどのように機能しているかについて私が理解していないことがあり__import__ますか?

更新:を使用すると、正常に動作しているようimportlibです。

アップデート2:行が実行される直前のsys.meta_pathとは次のとおりです。sys.import_path__import__

>>> sys.meta_path
[]
>>> sys.path_hooks
[<type 'zipimport.zipimporter'>]

異常なことがあるようには思えません。しかし、インポートしているパッケージがsetuptoolsのdevelopコマンドを使用してインストールされていることに気づきました。それは違いを生みますか?

4

1 に答える 1

1

空のファイル「foo.py」を作成してから、次のような「bar.py」を作成します。

__import__('foo', [], [], [''])
import sys
print sorted(sys.modules)

fooは、1 回だけを含むリストを出力し、末尾のドットを含むリストを出力します。したがって、ここで問題を引き起こしているのはfoo.、セロリが使用されているという事実だけではありません。__import__2 番目のモジュールを追加するために、セロリがどのような追加のステップを踏んでいるかを理解できますか? (またはprint sorted(sys.modules)、呼び出しの直前と直後は、__import__()その時点で両方のモジュールが表示されていることを示唆していますか? その場合、インポートの時点でどのインポートフックが定義されているかを確認する必要がありますか?)

于 2010-06-15T04:40:35.350 に答える