한번 import로 호출된 module과 package는들 dictionary 형태로 가지고있음
한번도 import로 호출되지 않았던 module과 package는 sys.modules에 존재하지 않는다.
list이며, 문자열 형태로 경로를 리스트 요소로 갖고있음 python은 경로를 하나하나 확인하며 import할 package가 있는지 확인한다.
python이 기본으로 제공하는 module로 python이 쉽게 찾을 수 있다.
*sys는 python에 포함되어 있는 module 임.
출력을 확인 해볼 수 있음
import sys
print(sys.path)
print(sys.modules)
예를 들어 jha 라는 module 혹은 package를 import 할 때 python이 찾는 순서는
import jha
- sys.modules에서 불러온적이 있다면 sys.modules 에서 찾고 없다면
- built-in modules python에 내장된 라이브러리에서 찾고
- sys.path 마지막으로 sys.path에서 module혹은 package를 리스트에 저장된 경로를 하나 하나 확인 하며 찾는다.
built-in moduel, pip를 통해 설치한 외부 package는 site-packages로 자동 저장되며, site-packages는 sys.path에 포함 되어있어 import로 호출시 크게 문제 없으며 문제는
직접개발한 local package인데 이를 import할때는 경로를 정확하게 호출해야한다.
my_app 이라는 프로젝트를 예로 들면
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
위 패키지에서 module5.py 라는 module을 호출하려면 경로는 이렇게 된다.
my_app > package2 > subpackage1 > module5
python 방식으로 표현하면 .(dot)로 디렉토리를 구분한다
my_app 디렉토리 아래 package2 아래 subpackage1 아래 module5 안의 클래스
my_app.package2.subpackage1.module5
이렇게 경로를 확인해서 직접 호출하는 것을 절대경로 라고 하는데 이를 Absolute Path 라고 한다.
from package2.subpackage1.module5 import Func(module 내 클래스)
from import로 호출 하게되면
현재 my_app이라는 프로젝트 안에 있다면 package2 라는 디렉토리 밑에 subpackage1 디렉토리 밑에 module5 내 함수를 호출 하겠다고 하는 것 이다.
Relative Path는 현재 위치에서 import 하는 기준으로 상대적경로 라고 한다.
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
package2 안의 module3에서 module5내의 함수를 import 하려면 아래처럼 할수있다.
from .subpackage1.module5 import function2
module5는 subpackage1안에 있는데 subpackage1은 module3와 같은 디렉토리에 있기 때문에 상위디렉토리는 안내할 필요없이 .(dot) 으로 현재위치를 안내하고 subpackage1 밑 module5안의 fuction2 함수를 호출 하는것이다.
*.(dot)는 파일의 현재 위치를 안내한다
반대로 하위 module5에서 상위 디렉토리에 있는 module4내의 func5를 호출 할때는
from ..module4 import func5
.. 은 상위 디렉토리를 말하며 상위 module4에서 func5 함수를 호출한다는 코드이다.