Import Search
🎆 Import Search
Pythonは外部のpackageまたはmoduleを使用するためにインポートする必要があります.Pythonファイルをインポートするには、Pythonファイルまたはpackageディレクトリを見つける必要があります.
では、Pythonはどのようにモジュール/パッケージを見つけますか?
1~3の順に探す
🎈 sys.modules
これは辞書で、すでに輸入されたモジュールとパッケージが格納されています.輸入されたモジュールとパッケージには、Pythonが再検索を必要としない機能があります.
新しくインポートしたモジュールの場合sys.モジュールに見つかりません.
🎈 built-in module
Pythonが提供するライブラリを個別にインストールせずに使用できます.インポートするモジュールはsysです.モジュールにない場合は、2番目はbuit-inmoduleで検索します.
Sysも内蔵モジュールで、早期にインポートできます.
🎈 sys.path
インポートするpackageアドレスをstringタイプのデータとして要素のlistとして格納します.インポートするモジュールはsysです.モジュールと組み込みモジュールにない場合sys.path要素にインポートするパケットにアドレスがあるかどうかを確認します.
['',
'/Users/song-eun-u/anaconda3/bin',
'/Users/song-eun-u/anaconda3/lib/python36.zip',
'/Users/song-eun-u/anaconda3/lib/python3.6',
'/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
'/Users/song-eun-u/.ipython']
🎇 Absolute path vs Relative path
📌 Absolute path
インポートするアドレスを示す場合は、ルートディレクトリからアドレスを入力してもインポートファイルの場所を入力しても、常に同じパスで表示できます.
📌 Relative path
インポートするモジュールの現在のディレクトリに対するアドレスを示します.└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
🎯 absolute pathを使用したモジュール5のインポートfrom package2.subpackage1 import module5
🎯 module 3の相対パスを使用してmodule 2をインポートするfrom ..package1 import module2
🔍 absolute pathを使用すると、どこからインポートしてもパスは常に同じですが、パスが長くなる可能性があるという欠点があります.
🔍 相対pathの欠点は、absolute pathよりもパスの長さが少ない可能性があるが、混同されやすく、ファイルの場所が変化した場合、作成したパスを変更する必要があることです.
✨ calculator package
2つの数を加算した簡単なパッケージを作成しました.__init__.py
のキャラクターは?__init__.py
が属する場所がパッケージディレクトリとして機能しています.Python 3.3バージョンからinitを開始します.pyファイルがなくてもパッケージとして扱われます.
サブバージョン互換性のために作成しましょう.
🧨 main.py相対パスを使用してadd and multiplyをインポート中に発生したエラー
🧵 Pythonがmoduleの場所を検索すると、nameの値を使用して相対パスが検索され、mainのimportはnameがmainであるため相対パスを検索する基準が取得されず、エラーが発生します.
💡 mainmoduleからインポートするには、絶対パスを使用する必要があります.
mainのimportをabsolute pathに変更すると、エラーなく正常に動作します.
🧨 module add_and_multiply.py
をabsolute pathにインポート中に発生したエラー
プライマリファイル実行、add and multiply.pyはコンピュータパッケージのサブモジュールとして登録されています.メインモジュールの絶対パスが登録され,他のモジュールは比較可能なルートとして機能する.
したがってmainは絶対pahtを使用する必要があり,他のサブモジュールは相対パスメソッドを使用してモジュールをインポートする必要がある.
Reference
この問題について(Import Search), 我々は、より多くの情報をここで見つけました
https://velog.io/@bufflect/import-search
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
from package2.subpackage1 import module5
from ..package1 import module2
2つの数を加算した簡単なパッケージを作成しました.
__init__.py
のキャラクターは?__init__.py
が属する場所がパッケージディレクトリとして機能しています.Python 3.3バージョンからinitを開始します.pyファイルがなくてもパッケージとして扱われます.サブバージョン互換性のために作成しましょう.
🧨 main.py相対パスを使用してadd and multiplyをインポート中に発生したエラー
🧵 Pythonがmoduleの場所を検索すると、nameの値を使用して相対パスが検索され、mainのimportはnameがmainであるため相対パスを検索する基準が取得されず、エラーが発生します.
💡 mainmoduleからインポートするには、絶対パスを使用する必要があります.
mainのimportをabsolute pathに変更すると、エラーなく正常に動作します.
🧨 module
add_and_multiply.py
をabsolute pathにインポート中に発生したエラープライマリファイル実行、add and multiply.pyはコンピュータパッケージのサブモジュールとして登録されています.メインモジュールの絶対パスが登録され,他のモジュールは比較可能なルートとして機能する.
したがってmainは絶対pahtを使用する必要があり,他のサブモジュールは相対パスメソッドを使用してモジュールをインポートする必要がある.
Reference
この問題について(Import Search), 我々は、より多くの情報をここで見つけました https://velog.io/@bufflect/import-searchテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol