How import statement finds modules and packages

bingwen·2021년 10월 12일
0

sys.modules와 sys.path의 차이점

sys.modules

파이썬이 모듈이나 package를 찾기 위해 가장 먼저 확인하는 곳이다.
sys.modules는 단순한 dictionary이고 이미 import된 모듈과 package들을 저장하고 있다.
즉, 한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 되도록 하는 기능을 가지고 있다.
그렇기때문에 새로 import하는 모듈은 sys.modules에서 찾을수 없다.

sys.path

파이썬이 마지막으로 보는 장소가 sys.path이다.
sys.path는 기본적으로 list이며 string 요소들을 가지고 있는 list이다.
각 string 요소들은 다음 처럼 경로를 나타낸다.

['',
 '/Users/song-eun-u/anaconda3/bin',
 '/Users/song-eun-u/anaconda3/lib/python36.zip',
 '/Users/song-eun-u/anaconda3/lib/python3.6',
 '/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
 '/Users/song-eun-u/.ipython']

그러므로 파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인한다.

참고로 sys 는 파이썬에 포함되어 있는 모듈이다. 그러므로 다음 처럼 sys 모듈을 import 해서 sys.modules와 sys.path 를 출력할수도 있고 수정 할 수 도 있다.

import sys
print(sys.path)
print(sys.modules)

정리를 하자면, 파이썬은 import 하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈들을 확인 하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾는다.

sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴한다.

2. 파이썬이 sys 모듈의 위치를 찾는법.

Q) 파이썬이 모듈과 패키지를 찾는 방법으로 sys모듈을 사용한다.
그런데 sys 또한 모듈인데 파이썬이 어떻게 찾을까?

built-in 모듈
built-in 모듈이란, 해석 그대로 이미 파이썬에 내장되어 있는 모듈이다.
파이썬은 모듈을 찾는 순서 2번째로, built-in 모듈을 확인하게 되는데 이때 이미 파이썬에 내장되어 있는 "sys"를 발견하게 된다.

3. Absolute path와 relative path의 차이점

1. Absolute path (절대 경로)

절대 경로는 import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다는 뜻이다,
위의 my_app 프로젝트에는 package1,package2가 있고 그 아래 모듈이 존재한다.
만일 module5.py 에 function2 함수를 불러온다고 한다면

from package2.subpackage1.module5 import function2

Q) my_app 을 적지 않는 이유는 무엇일까?
위와 같이 module.py에 function2에 접근하기 위한 경로를 리눅스 directory로 표현한다면 다음과 같다.

my_app/package2/subpackage1/module5.py

파이썬에서 from import 키워드를 사용하게 되면, 이미 my_app프로젝트에서 출발하기 때문에, my_app은 적지 않는다.

정리
my_app 프로젝트 내에서는 어느 파일, 어느위에서 import 하던지 경로가 항상 위와 같기 때문에 absolute path 라고 한다.

2. Relative path(상대 경로)

절대경로와의 가장 큰 차이점은 "기준" 이다.

절대경로 처럼, 최상단 디렉토리를 기준으로 경로를 잡는 것이 아닌,

import하는 위치를 기준으로 경로를 정의한다.

package2의 module3 에서 package2의 subpackage1의 module5의 function2 함수를 import 한다면,

from .subpackage1.module5 import function2

여기서 dot(.)은 import가 선언되는 파일의 현재 위치 이다.

profile
MOONMOONY

0개의 댓글

관련 채용 정보