ホームページ > バックエンド開発 > Python チュートリアル > Python で「非パッケージでの相対インポートが試行されました」というメッセージが表示されるのはなぜですか?

Python で「非パッケージでの相対インポートが試行されました」というメッセージが表示されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-21 13:31:09
オリジナル
801 人が閲覧しました

Why Do I Get

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 するには、十分なドットを含むモジュール名が必要です。

非パッケージ モジュール

ただし、名前にドットが含まれていないモジュールは、モジュールの一部とみなされません。パッケージ。したがって、このようなモジュールでは、相対インポートは非​​パッケージ エラーで失敗します。

解決策

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

  1. モジュールをパッケージとして実行: python -m を使用します。 package.subpackage1.moduleX を使用して、モジュールをスクリプトとして実行せずにロードします。
  2. インポートと実行を分離する: パッケージ ディレクトリの外でスクリプトを実行し、パッケージ ディレクトリ内からモジュールをインポートして、相対インポートを有効にします。

以上がPython で「非パッケージでの相対インポートが試行されました」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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