파이썬에서 모듈이나 패키지를 임포트 하면 가장 먼저 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에 포함되어 있다.
절대 경로를 사용하면 경로가 길어질 수 있다. 그래서 이 점을 보완하기 위해 상대 경로를 사용 할 수 있지만 헷갈리기 쉽고 파일 위치가 달라지면 경로를 다시 수정해야 하기 때문에 웬만한 경우 절대 경로를 사용하는게 권장된다.