파이썬에서 모듈이나 패키지를 임포트 하면 가장 먼저 sys.modules
를 확인한다. 한 번 이상 사용되었거나 이미 내장되어 있는 모듈이나 패키지만 저장되어 있고 형태는 dictionary이다.
파이썬에서 기본적으로 제공하는 공식 라이브러리들로, 이미 포함되어 있어서 파이썬이 쉽게 찾을 수 있다.
앞의 sys.modules
built-in modules
을 확인 후 없다면 마지막으로 확인하는 곳이 sys.path
이다. sys.path
는 string 요소들을 가지고 있는 list이다. 임포트 하고자 하는 모듈이나 패키지가 list의 각 경로에 위치해 있는지 확인하고 만약 sys.path
에도 없다면 ModuleNotFoundError 에러를 반환한다.
sys.modules
와sys.path
는 모두 임포트 하려는 모듈, 패키지가 위치하는지 확인하는 경로지만 전자는 이미 임포트 되어있는것들만 위치해 있고 dictionary 형태지만 후자는 list 형태이다.
sys.path
는 list 이므로sys
모듈을 임포트해서append()
메소드를 사용해서 새로운 라이브러리 경로를 추가 할 수 있다.
sys
모듈은 파이썬에 내장되어 있는 모듈이기 때문에 sys.modules
에서 확인 할 수 있다.
import sys
print(sys.modules)
#실행결과{'sys': <module 'sys' (built-in)>, ...}
즉 파이썬에서 sys
모듈을 임포트할때 sys.modules
을 통해 위치를 확인한다.
└─ my_app.py
│ ├── main.py
│ ├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5
이렇게 현재 my_app
이라는 프로젝트가 있을 때, 절대 경로(absolute apth)는 항상 프로젝트의 current directory 로 부터 경로를 시작하고 상대 경로(Relative path)는 임포트하는 위치를 기준으로 시작한다.
current directory 라고 하는 현재의 프로젝트 디렉토리는 기본적으로
sys.path
에 포함되어 있다.
절대 경로를 사용하면 경로가 길어질 수 있다. 그래서 이 점을 보완하기 위해 상대 경로를 사용 할 수 있지만 헷갈리기 쉽고 파일 위치가 달라지면 경로를 다시 수정해야 하기 때문에 웬만한 경우 절대 경로를 사용하는게 권장된다.