[python] How import statement finds modules and packages


1.Import検索順


1) sys.modules
  • Simple Dictionaryは、インポートされたモジュールとパッケージを格納します.
  • は、インポートされたモジュールおよびパッケージを再検索する必要がなくなる機能を有する.
  • したがって,新しくインポートしたモジュールはsysである.モジュールに見つかりません.2) built-in modules
  • Pythonが提供するPython公式ライブラリ.
  • はすでにPythonに含まれているので、Pythonを見つけるのは簡単です.
  • 3) sys.path
  • 文字列要素を持つlist.
  • sys.パスにも見つからない場合は、ModuleNotFoundErrorエラーを返します.
  • 4) sys.モジュールとシステム.pathの違い
  • sys.ModulesはDickShownery,sysです.pathはリストです
  • 5)Pythonはsysモジュールをどのように配置するか.
  • sysはPythonに含まれるモジュールであるため、内蔵モジュール検索で内蔵sysが発見される.
  • 2. Absolute Path vs Relative Path


    Pythonにパスを表示する場合は、/ではなく\またはdot(.)を使用します.
    └── my_app
        ├── main.py
        ├── package1
        │   ├── module1.py
        │   └── module2.py
        └── package2
            ├── __init__.py
            ├── module3.py
            ├── module4.py
            └── subpackage1
                └── module5.py
    上記の構成を持つ項目があり、インポートする場合、パス設定は以下の方法で行います.
    1)絶対パス
    ファイルまたはパスが
  • importであるかどうかにかかわらず、パスは同じ絶対パスです.
  • の絶対パスを入力する必要があるため、パスが長くなる可能性があります.
  • from package1 import module1
    from package1.module2 import function1
    2)相対パス
    インポート
  • の場所に基づいてパスを定義します.
  • は、通常、ローカルパケットに他のローカルパケットをインポートする際に
  • を使用する.
  • パッケージまたはモジュールの前にポイントがある場合は、現在のパスから開始します.
  • # package2/module3.py
    from . import class1  #package2의 class1 임포트.
    from .subpackage1.module5 import function2  #package2의 하위 package인 subpackage1의 module5의 function2 함수를 import.
    
    # subpackage1/module5.py
    from ..module4 import class4  #dot 2개를 사용하여 상위 디렉토리도 설정 가능.

    3.計算パッケージの作成


    以下のような構造の項目と例がある.
  • main.py
  • # absoulte path
    #from calculator.add_and_multiply import add_and_multiply 
    
    # relative path
    from .calculator.add_and_multiply import add_and_multiply
    
    if __name__ == '__main__':
        print(add_and_multiply(1,2))
  • add_and_multiply.py
  • from .multiplication import multiply
    # from calculator.multiplication import multiply
    def add_and_multiply(a,b):
        return multiply(a,b) + (a+b)
  • multiplication.py
  • def multiply(a,b):
        return(a*b)

    1) main.pyインポートエラー発生


    main.pyで操作を試みるとインポートエラーが発生します.ImportError: attempted relative import with no known parent packageこれは、mainモジュールで相対パスを使用する場合、相対パスの起点であるmainモジュールの位置が見つからないためである.相対パスへのインポートは現在のモジュール名に基づいており、デフォルトモジュール名は常に__main__であるため、Pythonアプリケーションのデフォルトモジュールとして使用するモジュールは常に絶対パスを使用する必要があります.
    Pythonパッケージリンク参照

    2) add_and_multiply.pyインポートエラー発生


    main.pyでインポートエラーを解決し、add and multiply.pyを操作すると、さっきと同じエラーが発生します.その理由は上記の理由と同じである.メインモジュールがadd and multiplyに変更されたため、相対パスを使用して開始add and multiplyモジュールの位置が見つからない.絶対パスに変更したらmain.またpyの動作をしても運転が良いことが確認できます.

    4. __init__.pyのロール

    __init__.pyファイルの役割は、ディレクトリがパッケージの一部であることを示すことです.このファイルがなければ、パッケージとは思えません.python3.第3版からは、このファイルがなくてもパッケージとして扱われますが、サブバージョン互換性のために作成するのは安全です.

    1)注意!

    from game.sound import *
    >>> echo.echo_test()
    
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    NameError: name 'echo' is not defined
    *を使用して特定のディレクトリのモジュールをインポートする場合は、__init__.py変数を設定およびインポートできるモジュールをそのディレクトリの__all__ファイルに定義する必要があります.*シンボルを使用してインポートする場合は、ここで定義したモジュールのみをインポートします.
    # C:/doit/game/sound/__init__.py
    __all__ = ['echo']
    参照文書リンク