2011-09-21 7 views
5

まず、この質問がすでに別の場所で求められている場合は、私のお詫び申し上げます。私は本当にそれを探しましたが、何も見つかりませんでした。私は、ファイル__init__.pysub.pyを持って、フォルダmodで :サブモジュールをインポートするプライマリモジュール

状況は次のようです。 彼らは、次のデータ含まれています __init__.pyを:

print "mod" 

sub.py

import __init__ 
print "sub" 

今度は、次の手順を実行してみましょう:

>>> import mod 
mod 
>>> import mod.sub 
mod 
sub 

しかしimport mod.subをやって、なぜmod/__init__.pyが再び実行されますか?すでに輸入されていた。 我々だけで呼び出す場合と同じ奇妙な機能が存在します。

>>> import mod.sub 
mod 
mod 
sub 

私はimport __init__を変更することで動作を変更することはできますか?これは私に間違っていると思われる行です。

+0

なぜあなたは "import __init__"と言うのですか? – rocksportrocker

+0

主モジュール 'mod'には、' sub'でサブクラス化された共有クラスが含まれています。 – Turion

答えて

1

あなたはあなたが実際に辞書sys.modulesを使って何が起こっているか調べることができ

import mod 
+0

私はそれが逆に直感的であることがわかります。結局、私たちはすでに 'mod'フォルダに入っており、私はインタプリタが' mod.py'ファイルを探すと思っていました。 – Turion

7

によって

import __init__ 

を交換する必要があります。 Pythonはその辞書のキーに応じてモジュールをリロードすることを決めます。

import modを実行すると、1つのエントリmodsys.modulesに作成されます。

あなたがimport mod.subを実行すると、import __init__への呼び出しの後、Pythonはキーmod.__init__sys.modulesであるが、そのようなキーが存在しないので、それが再びインポートされているかどうかをチェックします。

最終的には、実際のモジュールがすでにインポートされているためではなく、sys.modulesにあるキーでPythonがモジュールを再インポートすることを決定しました。完全のために

+0

良い説明、ありがとう。 – Turion

0

、私は相対的な輸入品で遊んで別の解決策を見つけた:

from . import __init__ 

によって

import __init__ 

を交換してくださいしかし、これは動作しますなぜ私は理解していません。

編集:これは実際には機能しません。結果の__init__はモジュールmodではなく、タイプmethod-wrapperの何か他のものです。今私は完全に混乱している。

関連する問題