[python] How import statement finds modules and packages
1.Import検索順
1) sys.modules
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)絶対パス
ファイルまたはパスが
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
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.計算パッケージの作成
以下のような構造の項目と例がある.
# 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))
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
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']
参照文書リンク
Reference
この問題について([python] How import statement finds modules and packages), 我々は、より多くの情報をここで見つけました
https://velog.io/@goodpark/python-How-import-statement-finds-modules-and-packages
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
from game.sound import *
>>> echo.echo_test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'echo' is not defined
# C:/doit/game/sound/__init__.py
__all__ = ['echo']
Reference
この問題について([python] How import statement finds modules and packages), 我々は、より多くの情報をここで見つけました https://velog.io/@goodpark/python-How-import-statement-finds-modules-and-packagesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol