Pythonでモジュールをインポートするとき、インタープリターはsys.pathにリストされているディレクトリを検索します。最初に標準モジュールの中から、次に.py、.pycファイルおよび__init__.pyファイルを含むディレクトリ(パッケージ)の中から探します。
sys.modulesから取得します。ModuleNotFoundErrorがスローされます。.pyc)に変換され、キャッシュされます(書き込み権限があれば)。# mypkg/__init__.py(空であってもよい) # mypkg/mod.py # main.py import mypkg.mod
__init__.pyの有無(Python <3.3では必須)— すべてが重要です。sys.pathディレクトリを検索します(常に現在のスクリプトのディレクトリが最初に来ます)。from . import ...、絶対/相対インポート)。スクリプトのあるディレクトリに
random.pyという名前のファイルがあり、標準モジュールrandomをインポートしようとするとどうなりますか?
私のローカルファイルrandom.pyがインポートされ、標準ライブラリはインポートされません。モジュール名の衝突(シャドウイング)は、難解なバグの一般的な原因です。ファイル名には注意が必要です。
ストーリー
大規模なプロジェクトで、モジュールemail.pyが標準ライブラリのemailモジュールを偶然シャドウイングし、開発者は外部ライブラリのメール解析機能が動作しない理由を理解できずに長い間悩まされました。
ストーリー
MLプロジェクトで、os.path関数が動作しませんでした。メインスクリプトの近くにos.pyというファイルがあり、標準モジュールへのすべての呼び出しをキャッチしていました。名前の衝突が見つかるまで、デバッグに1か月かかりました。
ストーリー
マイクロサービスのREST APIでは、複数のサブパッケージ間でモデルの相対インポートを試みると循環インポートが発生しました。プロジェクト構造のリファクタリングとモジュールの明示的なロード順序後にのみ問題が解決されました。