このようなディレクトリ構造を考える
/main/
/main/common/foo.py
/main/A/
/main/A/src/
/main/A/src/bar.py
Pythonのrelative importsを使用してfoo
からbar
をインポートするにはどうすればよいですか?パスに追加することで実用的なソリューションを手に入れましたが、これは、いです。 Python 2.7で単一のimport
を使用する方法はありますか?
これは、この質問のより複雑なバージョンです。
正しい相対的なインポートは次のようになります。
from ...common import foo
ただし、相対的なインポートは1つのパッケージ内でのみ機能することを意図しています。 main
がパッケージの場合、ここで相対インポートを使用できます。 main
がパッケージでない場合、できません。
したがって、/main/
でスクリプトを実行しており、import A.src.bar
のような操作を実行している場合、その相対インポートは「トップレベルパッケージを超えた相対インポートの試行」で失敗します。これは、相対インポートがトップレベルパッケージA
の外部に何かをインポートしようとしているためです。
ただし、/
でスクリプトを実行し、import main.A.src.bar
のような処理を実行している場合、main
はパッケージであるため、その相対的なインポートは成功します。その場合、次の2つは同等です。
from ...common import foo
from main.common import foo
あなたのコメントに答えるために:.
の意味は、スクリプトがどこから実行されたかによって変わりません。パッケージ構造が何であるかによって変わります。