2016-05-06 7 views
1

私はプログラムディレクトリのextensionsサブディレクトリ内のモジュールのようなファイルがアプリケーションの初期化プロセスの早い段階でインポートされるこの機能を持つPythonアプリケーションを持っています。モンキーはこれをインポートするモジュールをパッチします

:私はこのような何かを行くその拡張ディレクトリ内の.pyファイルを持つことができるようにしたいのですが、今

def do_init(): 
    for thefname in glob.iglob(os.path.join(".","extensions","*")): 
     SourceFileLoader(os.path.basename(thefname),thefname).load_module() 
    #do other init stuff... 

if __name__ == "__main__": 
    do_init() 
    do_cool_things() 

これは、このような何か(これはmy_application.pyであると仮定)を探します

これは... my_applicationの将来のインポートのために機能します。しかし、if __name__ == "__main__"ガード内のdo_cool_thingsコールは元の動作を示します。なぜこのようなことが起きているのですか?その呼び出しに変更された動作をどのように反映させることができますか?

答えて

1

my_application.pyというスクリプトを実行して作成されたモジュールは、驚くほどmy_applicationではありません。スクリプトを実行して作成されたモジュールは__main__です。もちろん、 my_application.pyというファイルをインポートするモジュールは、my_applicationと呼ばれます。

import my_applicationの代わりにimport __main__またはimport builtinsのいずれかを使用してください。

簡単なデモ:

#x.py 
import y 
print ("Hello", hello) 

#y.py 
import __main__ 
__main__.hello = 'world' 

のPython 3.4.3でのUbuntu 14.04のテスト:

$ python3 x.py 
Hello world 
$ 
+0

これは動作します!そして、私はここで、モジュールの機能を、インポート機構を介してスタックを巻き戻すことによって取得しようとしています...:P – Schilcote

関連する問題