[Python/TIL] 파이썬이 import로 패키지를 불러오는 방법
sys.modules
와 sys.path
의 차이점
sys.modules
파이썬에서 이미 불러온 모듈을 저장해놓은 딕셔너리이다.({모듈명 : 모듈객체}) 같은 모듈을 또 불러올 경우 딕셔너리에서 모듈을 찾는 것이므로 처음 불러왔을 때 보다 빠르다.
sys.path
모듈을 import 할 때 모듈을 검색하는 경로들로 이뤄진 리스트이다. ([모듈경로1, 모듈경로2, 모듈경로3]) 파이썬이 sys.modules과 built-in 모듈 내에서도 모듈을 못찾으면 마지막으로 가는 곳이 sys.path이다. 모듈을 찾기 위해서 리스트 내 경로들을 다녀야 하기 때문에 sys.modules의 딕셔너리를 사용할 때 보다 오래 걸린다.
파이썬이 sys 모듈을 찾는 방법
sys.builtin_module_name
를 입력하면 built-in 모듈 목록의 튜플을 확인할 수 있다. sys 모듈은 built-in 모듈이므로 sys 모듈도 이 튜플 내에 있다. 그래서 사용자는pip install sys
를 하지 않아도 import sys
를 입력하면 sys 모듈을 불러올 수 있다.
Absolute path와 relative path의 차이점
built-in 모듈이나 pip을 통해 패키지를 설치한 경우엔 import 하는데 복잡하지 않다. 직접 개발한 패키지나 Github 등에서 작은 프로젝트의 패키지를 import 할 경우엔 경로를 설정해줘야 한다.
Absolute Path
절대경로(Absolute path)는 import를 할 때 같은 프로젝트 내에 있는 것들을 파일의 경로와 상관없이 불러오는 방법이다.
예시로 그림1의 my_app
이란 프로젝트 내 package1/module1.py
에서 package2/module3.py
를 불러와야 한다면
from package2 import module3
와 같은 식으로 프로젝트 폴더의 최상단을 기준으로 경로를 설정한다.
Relative Path
상대경로(Relative path)는 절대경로와 달리 현재 파일을 기준으로 경로를 설정한다. 그림1의 경우 package2/module4.py
에서 package1/module1.py/function2
를 불러온다면
from ..package1.module1 import fuction2
와 같은 식으로 해야 한다. 여기서 ..
은 현재 위치에서 상위 폴더로 이동하는 역할이며, .
을 사용할 경우 현재 디렉터리 내에서 찾는 것을 의미한다.
__init__.py의 역할
__init__.py
파일은 해당 파일의 디렉터리가 패키지의 일부임을 알려주는 파일이다. python 3.3 이후에는 __init__.py
가 없어도 패키지로 인식하지만 호환성을 위해 넣어두는 것이 좋다. __init__.py
은 내용이 없어도 괜찮다. 하지만 패키지 내 모듈을 모두 불러오는 import * 을 사용하고 싶은 경우 __init__.py
의 내용을 수정해야 한다.
# __init__.py
__all__ = ['module3', 'module4', module5]
위와 같이 수정한다면 from package2 import *
라는 구문을 통해 package2 내의 모듈들을 모두 불러올 수 있다.