Python での相対インポート
一般的なエラー「非パッケージで相対インポートを試行しました」は、Python で相対インポートを操作するときによく発生します。パイソン。この記事の目的は、相対インポートの概念を明確にし、このエラーに対処する解決策を提供することです。
スクリプトとモジュールの違い
主な違いは、Python ファイルの扱い方にあります。ロードされています。 python myfile.py を使用して直接実行されたファイルは、トップレベルのスクリプトとみなされます。逆に、別のファイル内の import ステートメントを使用してインポートされたファイルはモジュールです。この区別は、相対インポートを理解するために重要になります。
名前付けの重要性
ロード時に、各ファイルには name 属性に保存される名前が割り当てられます。 。スクリプトとしてロードされた場合、その名前は __main__ に設定されます。モジュールとしてインポートされた場合、その名前には、そのモジュールが属するパッケージとファイル名の両方が反映されます。
たとえば、提供されたディレクトリ構造では、
package/ __init__.py subpackage1/ __init__.py moduleX.py moduleY.py subpackage2/ __init__.py moduleZ.py moduleA.py
moduleX をインポートすると、モジュールに名前が割り当てられます。 package.subpackage1.moduleX、moduleA をインポートすると package.moduleA という名前になります。ただし、どちらかのモジュールを直接実行すると、name が __main__ に設定され、パッケージ情報が抑制されます。
相対インポート
相対インポートは、次を使用してパッケージ階層を移動します。モジュールの名前。たとえば、from .. import foo は階層の上への移動を示します。 from .. import を使用して ascend するには、十分なドットを含むモジュール名が必要です。
非パッケージ モジュール
ただし、名前にドットが含まれていないモジュールは、モジュールの一部とみなされません。パッケージ。したがって、このようなモジュールでは、相対インポートは非パッケージ エラーで失敗します。
解決策
エラーを解決するには、次の解決策を検討してください。
以上がPython で「非パッケージでの相対インポートが試行されました」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。