次のディレクトリ構造を想像してください:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
をコーディングしていてmod1
、 から何かをインポートする必要がありますmod2
。どうすればいいでしょうか?
試してみましたfrom ..sub2 import mod2
が、「非パッケージで相対インポートを試行しました」というメッセージが表示されます。
グーグルで調べてみたのですが、「sys.path
操作」ハックしか見つかりませんでした。もっときれいな方法はないのでしょうか?
私の は現在すべて__init__.py
空です
sub1
sub2 にはサブパッケージ間で共有されるクラス ( 、subX
など)が含まれているため、これを実行しようとしています。
私が求めている動作は、ペップ366(ありがとう、ジョンB)。
ベストアンサー1
問題は、mod1.py をインタープリターに引数として渡すことで、モジュールを '__main__' として実行していることです。
からペップ328:
相対インポートでは、モジュールの __name__ 属性を使用して、パッケージ階層内のモジュールの位置を決定します。モジュールの名前にパッケージ情報が含まれていない場合 (たとえば、'__main__' に設定されている場合)、モジュールが実際にファイル システム上のどこに配置されているかに関係なく、相対インポートはモジュールが最上位モジュールであるかのように解決されます。
Python 2.6 では、メイン モジュールを基準にしてモジュールを参照する機能が追加されています。ペップ366変更について説明します。