ホームページ > バックエンド開発 > Python チュートリアル > モジュールが `__main__` として実行されると、Python で相対インポートが失敗するのはなぜですか?

モジュールが `__main__` として実行されると、Python で相対インポートが失敗するのはなぜですか?

DDD
リリース: 2024-12-19 06:43:10
オリジナル
372 人が閲覧しました

Why Do Relative Imports Fail in Python When a Module is Run as `__main__`?

Python での相対インポート: 詳細な説明

複数のサブパッケージを含む構造化ディレクトリを操作する場合、他のサブパッケージからモジュールをインポートすると、共通の要件。ただし、from ..sub2 import mod2 などの相対インポートを使用する標準的なアプローチは、特定のシナリオでは失敗する可能性があります。

これは、提供されたディレクトリ構造内で mod1 から mod2 をインポートしようとした開発者の場合に当てはまります。質問の中で。 「非パッケージで相対インポートを試行しました」というエラー メッセージは、相対インポートに問題があることを示しています。

問題の根本は、モジュールが __main__ として引数として渡されて実行されていたという事実にあります。通訳者。 PEP 328 によると、相対インポートではモジュールの __name__ 属性を使用して、パッケージ階層内の位置を決定します。モジュールの名前が __main__ に設定されている場合、相対インポートは、ファイル システム内の実際の場所に関係なく、モジュールがトップレベル モジュールであるかのように解決されます。

この動作により、インポートしようとするときに混乱が生じる可能性があります。他のサブパッケージのモジュール。この問題を解決するには、コードをスクリプトに配置し、import sub2.mod2 などの絶対インポートを使用して関連するサブパッケージを明示的にインポートすることをお勧めします。

ただし、Python 2.6 以降では、モジュールを参照する機能が追加されています。メインモジュールに関連するモジュールが導入されました。 PEP 366 にはこの変更について説明されています。相対インポートを効果的に使用するには、__main__ を使用する代わりにメイン モジュールを参照することが不可欠です。これは、次のようなさまざまな方法で実現できます。

  • __init__.py は、__package__ 属性を宣言して、含まれるパッケージに名前を割り当てることができます。
  • __import__() メソッドを使用して、サブパッケージをインポートして変数に割り当てます。
  • プレースホルダー モジュール __init__.py を使用して、モジュールが空の場合でも、__path__ 属性と __package__ 属性を宣言します。

これらの手法を採用することで、開発者は相対インポートを効果的に利用して、Python プロジェクトを整理し、構造化された方法でモジュール間の依存関係を管理できます。

以上がモジュールが `__main__` として実行されると、Python で相対インポートが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート