ホームページ >バックエンド開発 >Python チュートリアル >Python 3 の相対インポートが失敗するのはなぜですか?どうすれば修正できますか?

Python 3 の相対インポートが失敗するのはなぜですか?どうすれば修正できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 05:21:18281ブラウズ

Why Are My Python 3 Relative Imports Failing, and How Can I Fix Them?

Python 3 の相対インポート: 理解と回避策

相対インポートは、同じディレクトリ内のモジュールをインポートするために一般的に使用されますが、場合によってはImportError や ModuleNotFoundError などのエラー。これらの問題を解決するには、根本的な理由を理解することが重要です。

Python 3 の相対インポートの動作

Python 3 では、相対インポートは、モジュールが他のモジュールをインポートしている場合にのみ機能します。同じパッケージ内にあります。パッケージは、パッケージのステータスを示す __init__.py ファイルを含むディレクトリです。パッケージに追加モジュールを含むサブディレクトリが含まれている場合、それらのサブディレクトリから他のサブディレクトリ内のモジュールへの相対インポートは失敗します。

ルート パッケージ インクルード

この問題を解決するには、次のことを確認してください。関連するモジュールの親ディレクトリはパッケージであり、__init__.py ファイルの存在によって示されます。親ディレクトリがパッケージではない場合、相対インポートは「既知の親パッケージが存在しない相対インポートを試行しました。」というエラーで失敗します。

エラー: "ModuleNotFoundError: No module names 'mymodule'"

このエラーは、インポートされるモジュール (この場合は mymodule) が指定されたパスに存在しない場合に発生します。モジュールが存在し、名前が正しいことを確認してください。

エラー: "SystemError: 親モジュール '' が読み込まれていないため、相対インポートを実行できません。"

このエラーは、親モジュール (相対インポートを含むモジュール) がロードされていません。相対インポートを試行する前に、親モジュールが実行中またはインポートされていることを確認してください。

相対インポートの回避策

相対インポートを回避できない場合は、次の回避策があります。

  • 絶対インポートを使用する:ルート パッケージからの絶対パスを使用して、from .mymodule import myfunction を from mypackage.mymodule import myfunction に置き換えます。
  • PYTHONPATH を変更します: パッケージの親ディレクトリを PYTHONPATH 環境変数に追加しますモジュール検索パスで利用できるようにします。
  • Frobコード内の PYTHONPATH: 指定された回答で提供されているようなコード スニペットを使用して、親ディレクトリを sys.path に追加します。

パッケージ内でのスクリプトの実行に関する注意

Python の作成者である Guido van Rossum は、パッケージ内でスクリプトを実行することはアンチパターンであると考えており、それは不要なものとして。ただし、これが必要なシナリオでは、上記の回避策を採用できます。

以上がPython 3 の相対インポートが失敗するのはなぜですか?どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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