1. ホーム
  2. python

[解決済み] Pythonで相対インポートを行うには?

2022-03-17 07:53:30

質問

このようなディレクトリ構造を想像してください。

app/
   __init__.py
   sub1/
      __init__.py
      mod1.py
   sub2/
      __init__.py
      mod2.py

コーディング中 mod1 から何かをインポートする必要があります。 mod2 . どうすればいいのでしょうか?

試してみた from ..sub2 import mod2 が、「Attempted relative import in non-package" 」と表示されます。

ググってみたけど、"しかなかった。 sys.path 操作" のハックです。クリーンな方法はないのでしょうか?


編集:すべての私の __init__.py は現在空です。

Edit2: サブ2にはサブパッケージ間で共有されるクラスが含まれているため、これを行おうとしています ( sub1 , subX など)。

Edit3: 私が求めている動作は、以下の記述と同じです。 PEP 366 (ジョンBさんありがとうございます)

解決方法は?

誰もが、質問に答えるよりも、何をすべきかを教えたがっているようです。

問題は、mod1.pyをインタプリタに引数として渡すことで、モジュールを'__main__'として実行していることです。

から PEP 328 :

相対インポートでは、モジュールの __name__ 属性を使用して、パッケージ階層におけるそのモジュールの位置を決定します。モジュール名がパッケージ情報を含んでいない場合 (例えば '__main__' に設定されている場合)、 モジュールがファイルシステム上のどこに実際に配置されているかにかかわらず、 モジュールがトップレベルモジュールであるかのように相対インポートが解決されます。

Python 2.6では、メインモジュールから相対的にモジュールを参照する機能が追加されるそうです。 PEP 366 は、この変更について説明しています。

更新情報 : Nick Coghlanによると、推奨される代替案は、-mスイッチを使ってパッケージ内のモジュールを実行することだそうです。