파이썬은 모듈(Module) 및 패키지(Package)를 찾을 때 3가지 장소를 순서대로 보면서 찾습니다.
파이썬이 모듈이나 패키지를 찾을 때 가장 먼저 확인 하는 곳입니다.
sys.moddules는 dictionary 형태로 되어있습니다.
python 실행 후 한 번 이상 모듈이나 패키지들이 import가 된 경우 다시 찾지 않아도 되는 기능을 가지고 있습니다.
따라서 새로 import 하는 모듈은 sys.modules에서 찾을 수 없습니다.
파이썬에서 제공하는 파이썬 공식 라이브러리들 입니다.
Built-in 모듈은 파이썬에 이미 포함되어 있기 때문에 파이썬이 쉽게 찾을 수 있습니다.
마지막으로 파이썬이 확인하는 부분이 바로 sys.path입니다.
기본적으로 list형태이며 string요소들을 가지고 있는 list입니다.
pip로 새롭게 설치한 패키지도 이 곳을 통해서 찾게됩니다.
정리하자면
파이썬은 import하고자 하는 모듈과 패키지를 찾을 때 먼저 sys.modules를 찾아보고
없으면 built-in 모듈들을 확인하고 마지막으로는 sys.path에 지정된 경로들을 확인해서 찾습니다.
1.
'sys'라는 모듈도 import 해야하는 모듈입니다.
그렇다면, 파이썬은 sys모듈의 위치를 어떻게 찾을 수 있을까요?
위의 코드를 실행시키면 가장 첫 줄에서 볼 수 있는 부분입니다.
sys 모듈은 이미 built-in 되어 있기 때문에 built-in-module이 있는 부분에서 찾게됩니다.
2. 절대경로(Absolute path)와 상대경로(Relative path)의 차이점은?
위와 같은 프로젝트가 있다고 가정합니다.
my_app 프로젝트는 package1과 package2 라는 2개의 package를 가지고 있습니다.
package2는 subpackage2 라는 중첩 package를 가지고 있습니다.
절대 경로를 사용해 package1과 package2를 import하면
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function
경로의 시작점들은 항상 my_app 이라는 프로젝트의 최상위 디렉토리에서 시작합니다.
my_app 프로젝트 내에서는 어느 파일, 어느 위치에서 import해도 경로가 동일하기 때문에
절대경로(absoulte path) 라고 합니다.
반면, 상대경로(relative path)는 절대경로와는 다르게 import하는 위치를 기준으로 경로를 정의합니다.
package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import 하려면
from . import class1
from .subpackag1.module5 import function2
위와 같이 할 수 있습니다.
상대경로는 절대경로에 비해 간결해 지는 장점이 있지만 프로젝트 규모가 커지고 복잡해질수록 헷갈리기가 쉽고 파일 위치가 변경되면 경로 위치도 바꿔줘야하는 단점이 있습니다.
그래서 특별한 경우가 아니라면 절대경로(absolute path)를 사용하는게 권장됩니다.