[Python] How Import statement finds Modules & Packages
python | February 11, 2020
Import 할 때 파이썬이 모듈이나 패키지 찾는 순서
import를 할 경우, python은 다음의 순서대로 file(module)이나 directory(package)를 찾는다.
sys.modules
built-in modules
sys.path
sys.path에서도 못 찾으면 ModuleNotFoundError를 return한다.
sys.modules
python이 module이나 package를 찾기 위해 가장 먼저 확인하는 곳
단순한 dictionary이며, 한번이라도 이미 import된 module과 package들을 저장하고 있다.
그러므로 새로 import 하는 module은 sys.modules에서 찾을 수 없다.
built-in modules
python에서 제공하는 파이썬 공식 라이브러리들
이미 python에 포함되어 나오므로 python이 쉽게 찾을 수 있다.
sys.path
기본적으로 list이며, 경로를 나타내는 string 요소들을 가지고 있는 list
python은 list의 각 경로를 하나하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인한다.
pip을 통해 설치한 외부 module 및 package는 자동으로 site-packages라는 디렉토리에 설치되는데, 이 site-packages는 sys.path에 이미 포함되어 있다.
current directory라고 하는 현재의 프로젝트 디렉토리는 default로 sys.path에 포함된다.
python은 sys module의 위치를 어떻게 찾을까?
sys도 import 해야하는 module이다.
sys module은 이미 python에서 제공하는 built-in module이다.
따라서 import sys 할 때 python은 sys를 built-in modules에서 찾을 수 있다.
만약 sys가 한번이라도 import 되었다면 sys.modules에서 바로 찾을 수 있다.
built-in modules에는 뭐가 있는지 알고 싶다면:
import sys
sys.builtin_module_names
module의 위치(path)를 알고 싶다면:
import inspect
inspect.getfile(<modulename>)
Local package를 import 하는 경로
built-in module이나 pip을 통해 설치한 외부 module은 일반적으로 import 하는 데 큰 문제가 되지 않는다.
그러나 직접 개발한 local package를 import 할 때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야 한다.
Absolute path
경로가 프로젝트의 가장 최상위 디렉토리에서 시작한다.
일반적으로 사용하는 방식이다.
'''
my_app.package1.subpackage1.module1.py와 같은 형식인데,
1) my_app이라는 프로젝트 안에 있으므로 가장 최상위 디렉토리인 my_app은 생략한다.
2) import를 사용할 때 module의 확장자는 생략한다.
'''from package1.subpackage1.module1 import function1
Relative path
경로를 import 하는 위치를 기준으로 정의한다.
dot(.); import가 선언되는 파일의 현재 위치 two dots(..); 현재 위치에서 상위 디렉토리로 가는 경로
경로가 길어질 수 있는 absolute path의 단점을 보완하기 위해서 사용할 수 있다.
선언해야 하는 경로의 길이를 줄여준다.
헷갈리기 쉽고, 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있다.
웬만한 경우 absolute path를 사용하는 걸 권장한다.
일반적으로 local package 안에서 다른 local package를 import 할 때 사용한다.