Pythonで相対インポートを行うにはどうすればいいですか? 質問する

Pythonで相対インポートを行うにはどうすればいいですか? 質問する

次のディレクトリ構造を想像してください:

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

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

試してみましたfrom ..sub2 import mod2が、「非パッケージで相対インポートを試行しました」というメッセージが表示されます。

グーグルで調べてみたのですが、「sys.path操作」ハックしか見つかりませんでした。もっときれいな方法はないのでしょうか?


私の は現在すべて__init__.py空です

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

私が求めている動作は、ペップ366ありがとう、ジョンB)。

ベストアンサー1

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

からペップ328:

相対インポートでは、モジュールの __name__ 属性を使用して、パッケージ階層内のモジュールの位置を決定します。モジュールの名前にパッケージ情報が含まれていない場合 (たとえば、'__main__' に設定されている場合)、モジュールが実際にファイル システム上のどこに配置されているかに関係なく、相対インポートはモジュールが最上位モジュールであるかのように解決されます。

Python 2.6 では、メイン モジュールを基準にしてモジュールを参照する機能が追加されています。ペップ366変更について説明します。

おすすめ記事