약간 1차 확인을 거치는 관문 같은 느낌이라 할 수 있다.
sys.modules 는 파이썬이 모듈이나 package 를 찾기 위해 가장 먼저 확인하는 곳이다.
위의 캡처 화면의 콘솔을 확인해 본다면ㅡ
sys.modules 는 단순한 dictionary 이다.
이미 import 된 모듈과 패키지들을 저장하고 있다.
파이썬이 또 찾지 않아도 되도록 하는 기능을 가지고 있다.
그러므로 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없다.
sys.modules 와 다르게 sys.path 는 기본적으로 list 이며 string 요소들을 가지고 있는 list 이다.
왜? string 요소를 가지고 있나요? 라고 물으신다면..
위의 캡처 화면을 보듯이, 경로 자체가 문자로 표기되기 때문이지 않을까?
파이썬이 list 의 각 경로를 하나하나 확인하면서 해당 경로에 import 하고자 하는 package 가 위치해 있는지 확인 한다.
파이썬이 import 하고자 하는 모듈과 package 를 찾을 때에,
sys 도 import 해야 하는 모듈이다.
내가 만약 파이썬 파일에서 import sys 라고 입력한다 치면 파이썬에서 built in 라이브러리에서 sys 라는 키값을 찾을 것이다.
그리고 sys.modules 에 나오는 sys 라는 키값의 밸류 들을 받아서 쓸 수 있게 할 것이다.
my app >> from package1.module2 import function2
하나의 프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와같이 시작점이 프로젝트의 가장 최상위 디렉토리에서 시작하게 된다.
그러므로 절대 경로는 현재 디렉토리 로부터 경로를 시작하게 되는 것이다.
일반적으로 local package 를 import 할 때는 absolute path 절대 경로를 사용하면 된다.
단점은 경로가 길어질 수가 있다.
package2/module3.py # 현재 경로의 위치
from . import class1 # dot 을 1번 사용
from . module4 import class4 # dot 을 2번 사용
상대 경로란 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는 것이 아니다.
바로 import 하는 위치를 기준으로 경로를 정의 한다.
어떻게?
dot 을 사용하는 것으로 경로를 이야기 할 수 있다.
single dot 은 import 가 선언되는 파일의 현재 위치를 이야기한다.
현재 위치에 속해 있는, 보니까 class1 을 갖고 오는 것.
double dot 은 현재 위치에서 상위 directory 로 가는 경로이다.
위의 화면에서 확인할 수 있듯이, 경로를 따로 만들어 보고 package2 의 module4.py 파일에 class , 메소드를 임의로 만들었다.
프로젝트의 최상위 에 위치한 main.py 파일에서 import 로 실행시킨 화면이다.