2016-10-15 17 views
2

ここで私は初めてのstackoverflow quesionを使います。私は答えを探しましたが、明確な答えが見つかりませんでした。ここに状況があります。私はこのような構造を持っている:Python:サブパッケージとメインパッケージの両方からサブパッケージモジュールをインポートする

myapp 
    package/ 
     __init.py__ 
     main.py 
     mod1.py 
     mod2.py 

さて、このシナリオでは、main.pyから私はまたmod2.py.でインポートする必要がmod1.pyを、インポートしていますすべては私の輸入が次のようになり、正常に動作します:

main.py:

mod2.py
from mod1 import Class1 

from mod1 import Class1 

は、しかし、私はメインのフォルダに私のmain.pyを移動する必要があります構造体は、このように:

myapp 
    main.py 
    package/ 
     __init.py__ 
     mod1.py 
     mod2.py 

そして今私はmod1をインポートする方法を変更する必要がありますEのmain.pyは:

from package.mod1 import Class1 

しかし、何も起こることである「はImportError: 『MOD1』という名前はありませんモジュール」を取得しないようにするために、私はmod2.py内部の変更の同じ型を作成してもらってください:

from package.mod1 import Class1 

なぜですか? mod2はmod1と同じフォルダ/ pakcageにあります。なぜ、main.pyを変更すると、mod2内のインポートを変更する予定ですか?

+0

mainはmod2をインポートしますか? – rassar

+0

@rassar:はい、そうです。 – rbrtk

+0

これが起こっている理由は、mainとmod2の両方がmod1をインポートし、mainが階層の上位にあるからです。 http://stackoverflow.com/questions/15174730/python-import-module-once-for-a-whole-package?rq=1 – rassar

答えて

1

これは、Pythonスクリプトを__main__スクリプトとして実行すると、Pythonがどのようにモジュールとパッケージを探すかによって発生します。

python main.pyを実行すると、pythonはmain.pyの親ディレクトリをpythonpathに追加します。これは、ディレクトリ内のパッケージとモジュールをインポートできることを意味します。 main.pyを移動すると、pythonpathに追加されたディレクトリが変更されました。

通常、スクリプトの移動を許可しないため、このメインスクリプトを実行するときにのみがインポート可能なため、このメカニズムをモジュールのインポートに頼る必要はありません。あなたは、あなたのpackageがすでにpythonpathにあるディレクトリにインストールされていることを確認する必要があります。これを行うにはいくつかの方法がありますが、最も一般的なのはsetup.pyスクリプトを作成し、実際にコンピュータにpythonをインストールする場合はinstall your python packageです。

関連する問題