41

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

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

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

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

親フォルダーからのモジュールのインポート

4

1 に答える 1

48

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

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

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

于 2012-12-27T16:06:31.847 に答える