このようなディレクトリ構造の場合
main/
common/
foo.py
A/
src/
bar.py
Pythonの相対輸入foo
からインポートするにはどうbar
すればいいですか? パスに追加することで実用的な解決策を見つけましたが、これは見苦しいです。import
Python 2.7 で単純に 1 つだけを実行する方法はありますか?
これはこの質問のより複雑なバージョンです:
ベストアンサー1
正しい相対インポートは次のようになります。
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
あなたのコメントに答えると、 の意味は.
スクリプトがどこから実行されたかによって変わるのではなく、パッケージ構造が何であるかによって変わります。