ホームページ >バックエンド開発 >Python チュートリアル >Python が「非パッケージでの相対インポート」エラーをスローするのはなぜですか?それを修正するにはどうすればよいですか?

Python が「非パッケージでの相対インポート」エラーをスローするのはなぜですか?それを修正するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-24 21:41:14521ブラウズ

Why Does Python Throw a

相対インポート: 詳細

Python プログラミングの世界では、相対インポートは混乱の一般的な原因です。この記事では、相対インポートの複雑さを掘り下げ、どこにでもある「非パッケージで相対インポートが試行されました」というエラー メッセージに対処します。

スクリプトとモジュールの区別

理解スクリプトとモジュールの根本的な違いは重要です。 Python ファイルを直接実行すると、そのファイルはスクリプトになり、__main__ という名前が割り当てられます。一方、ファイルをインポートすると、パッケージ階層内での位置を含む名前が付けられたモジュールになります。

モジュールの名前

割り当てられた名前モジュールへのインポートは、モジュールがパッケージからインポートされたか、そのディレクトリから直接インポートされたかによって異なります。モジュールがパッケージからインポートされる場合、その名前は、パッケージとそれに含まれるサブパッケージのドット区切りのパスに従います (例: package.subpackage1.moduleA)。ただし、モジュールがそのディレクトリから直接インポートされる場合、その名前はモジュール名のみになります (例: moduleA)。

相対インポートとパッケージ

相対インポートモジュールの名前に基づいて、パッケージ階層内の位置を決定します。モジュール名にドットが含まれていない場合、そのモジュールはパッケージの一部とみなされません。これは、モジュールの現在のディレクトリの外側を移動しようとする相対インポートが「非パッケージの相対インポート」エラーで失敗することを意味します。

エラーの解決

するにはこのエラーを解決するには、次の解決策を検討してください:

  1. -m を使用します。オプション: スクリプトの実行に使用するコマンドの前に -m を付けます。これは、スクリプトではなくモジュールとして扱われる必要があることを示します。例: python -m package.subpackage1.moduleX
  2. パッケージ ディレクトリからスクリプトを移動します: スクリプトを実行するための別のディレクトリを作成し、パッケージからそのスクリプトにモジュールをインポートします。これにより、スクリプトが main という名前のスクリプトとしてロードされるようになり、相対インポートが正しく機能できるようになります。

パッケージ ディレクトリは Python に含める必要があることに注意してください。これらのソリューションが機能するためのモジュール検索パス (sys.path)。さらに、Python 2.6 以降、モジュールには、その実効名に影響を与える name 属性と package 属性の両方が含まれます。

以上がPython が「非パッケージでの相対インポート」エラーをスローするのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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