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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-27 14:49:17964ブラウズ

Why Do Relative Imports in Python 3 Fail, and How Can I Fix Them?

Python 3 の相対インポート: 謎のエラー

Python 3 では、相対インポートは同じモジュール内からモジュールをインポートする便利な方法ですディレクトリ。ただし、予期しないエラーが頻繁に発生します:

エラー メッセージ:

  • ImportError: 既知の親パッケージなしで相対インポートを試みました
  • ModuleNotFoundError: 「mymodule」という名前のモジュールがありません
  • SystemError: 親モジュール'' がロードされていないため、相対インポートを実行できません

根本原因:

これらのエラーを理解するには、Python のモジュール インポート メカニズムを詳しく調べる必要があります。相対インポートでは、インポートするモジュールがパッケージ内に含まれている必要があります。パッケージは、__init__.py ファイルの存在によってパッケージとしてマークされたディレクトリです。

共通レイアウト:

多くの場合、パッケージは次の構造になります:

main.py
mypackage/
    __init__.py
    mymodule.py
    myothermodule.py

例コード:

  • mymodule.py
# Exported function
def as_int(a):
    return int(a)

# Test function for module  
def _test():
    assert as_int('1') == 1

if __name__ == '__main__':
    _test()
  • myoth ermodule.py
# Exported function
def add(a, b):
    return as_int(a) + as_int(b)

# Test function for module  
def _test():
    assert add('1', '1') == 2

if __name__ == '__main__':
    _test()
  • main.py
from mypackage.myothermodule import add

def main():
    print(add('1', '1'))

if __name__ == '__main__':
    main()

の場合main.py または mypackage/mymodule.py を実行すると、すべてがスムーズに動作します。ただし、相対インポートが原因で mypackage/myothermodule.py の実行が失敗します:

from .mymodule import as_int

解決策:

Guido van Rossum が説明しているように、この失敗の原因は次のとおりです。 Python は、パッケージ内からのスクリプトの実行をアンチパターンとして扱います。推奨される解決策は、相対インポートを避け、代わりに絶対インポートを使用することです:

from mypackage.mymodule import as_int

代替アプローチ:

それでも相対インポートを希望する場合は、 - を使用できます。 m オプションを使用してインポートするモジュールを指定しますが、冗長で不便になる可能性があります:

python3 -m mypackage.myothermodule

別の代替案は次のとおりです。 PYTHONPATH を操作してパッケージの親ディレクトリを含めます:

import sys
import os

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(SCRIPT_DIR))

from mypackage.mymodule import as_int

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

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