web-dev-qa-db-ja.com

親フォルダーのサブフォルダーからの相対的なインポートモジュール

このようなディレクトリ構造を考える

/main/
/main/common/foo.py
/main/A/
/main/A/src/
/main/A/src/bar.py

Pythonのrelative importsを使用してfooからbarをインポートするにはどうすればよいですか?パスに追加することで実用的なソリューションを手に入れましたが、これは、いです。 Python 2.7で単一のimportを使用する方法はありますか?

これは、この質問のより複雑なバージョンです。

親フォルダーからモジュールをインポートする

24
Hooked

正しい相対的なインポートは次のようになります。

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

あなたのコメントに答えるために:.の意味は、スクリプトがどこから実行されたかによって変わりません。パッケージ構造が何であるかによって変わります。

32
Claudiu