Python 3 の相対インポート: 謎のエラー
Python 3 では、相対インポートは同じモジュール内からモジュールをインポートする便利な方法ですディレクトリ。ただし、予期しないエラーが頻繁に発生します:
エラー メッセージ:
根本原因:
これらのエラーを理解するには、Python のモジュール インポート メカニズムを詳しく調べる必要があります。相対インポートでは、インポートするモジュールがパッケージ内に含まれている必要があります。パッケージは、__init__.py ファイルの存在によってパッケージとしてマークされたディレクトリです。
共通レイアウト:
多くの場合、パッケージは次の構造になります:
main.py mypackage/ __init__.py mymodule.py myothermodule.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()
# 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()
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 サイトの他の関連記事を参照してください。