ホームページ >バックエンド開発 >Python チュートリアル >Python 3 で相対インポートを使用すると「ImportError」が発生するのはなぜですか?

Python 3 で相対インポートを使用すると「ImportError」が発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-30 05:39:091024ブラウズ

Why Do I Get

Python 3 の相対インポート: 謎を解く

相対インポートは、同じディレクトリ内からモジュールをインポートする便利な方法を提供します。ただし、場合によっては、次のエラーが発生する可能性があります:

  • 「ImportError: 既知の親パッケージなしで相対インポートを試行しました」
  • 「ModuleNotFoundError: モジュール名がありません」 'module_name'"
  • "SystemError: 親モジュール '' がロードされていないため、相対インポートを実行できません"

これらのエラーを理解するために、分析してみましょう共通のディレクトリ構造:

main.py
mypackage/
    __init__.py
    mymodule.py
    myothermodule.py

この場合、相対インポート "from 「myothermodule.py」内の「.mymodule import myfunction」は、モジュール検索パスに「mymodule.py」が表示されないため失敗します。これは、sys.path 変数に依存する Python のモジュール解決メカニズムによるものです。

1 つの解決策は、相対インポートの代わりに絶対インポートを使用することです。

from mypackage.mymodule import myfunction

これにより、次のことが保証されます。 Python は、sys.path にあると想定される「mypackage」モジュール パスで「mymodule」を検索します。

ただし、モジュールをスクリプトとして実行できるようにしながら、相対インポートの利便性を維持したい場合は、次の点を考慮してください:

  • sys.path の先頭に親ディレクトリを追加します:
import sys
import os

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(SCRIPT_DIR))

from mypackage.mymodule import myfunction
  • 実行時に -m オプションを使用するscripts:
python3 -m mypackage.myothermodule

このアプローチにより、モジュールをファイルシステムではなく Python モジュール システムで見つけることができます。

結論として、次のエラー メッセージが表示されます。相対インポートは、Python のモジュール解決メカニズムに由来します。 sys.path の役割を理解し、さまざまな戦略を利用することで、これらのエラーを解決し、Python アプリケーションでシームレスにインポートできるようになります。

以上がPython 3 で相対インポートを使用すると「ImportError」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。