次のディレクトリ構造を想像してください:
app/ __init__.py sub1/ __init__.py mod1.py sub2/ __init__.py mod2.py
mod1 モジュール内で mod2 から何かをインポートするには、次のコードがあります。試行されました:
from ..sub2 import mod2
ただし、これによりエラーが発生します:「非パッケージで相対インポートを試行しました。」
エラーが発生する理由は次のとおりです。 mod1.py 引数をインタープリタに渡してモジュールを __main__ として実行すると、Python はそれをトップレベルのモジュールとして扱い、パッケージを無視します。
この問題を解決するには、sub1 ディレクトリと sub2 ディレクトリの両方で __init__.py ファイルを適切に初期化する必要があります。これは、これらのディレクトリが実際にパッケージであることを示しており、相対インポートを使用してディレクトリ間でインポートできることを示しています。
__init__.py ファイルを配置すると、次のコードは mod1 内に mod2 を正常にインポートします:
from ..sub2 import mod2
PEP 366 は、参照のメカニズムを提案していますメインモジュールを基準としたモジュール。 Python 2.6 以降のバージョンでは、次の構文を使用して、メイン モジュールを基準にしてモジュールをインポートできます:
from . import mod2 from .. import sub2
この動作は、サブパッケージのインポートに期待される機能と一致しており、一貫性のある直感的なインポート メカニズムを保証します。
以上がPython で「非パッケージで相対インポートを試みました」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。