How import statement finds modules and packages

brian_j·2022년 5월 1일
0

1. sys.modules 와 sys.path의 차이점

파이썬에서 모듈/패키치 찾는 순서
sys.modules > built-in modules > sys.path

sys.modules

  • dictionary 구조
  • 파이썬이 가장 먼저 모듈이나 패키지를 찾음
    sys.path
  • list 구조
  • 가장 마지막에 모듈과 패키지를 찾음
  • 여기서 못찾을 경우 ModuleNotFoundError 발생

sys.modules

파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳입니다.

sys.modules는 단순한 dictionary 입니다. 그리고 이미 import된 모듈과 package들을 저장하고 있습니다.

즉, 한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 되도록 하는 기능을 가지고 있습니다.

그러므로 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없습니다.

built-in modules

파이썬에서 제공하는 파이썬 공식 라이브러리들 입니다.

Built-in 모듈들은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있습니다.

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 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?

3. Absolute path와 relative path의 차이점

절대 경로는 기존 작업 디렉토리에 관계없이 파일 또는 폴더의 위치를 ..으로 설명하는 경로

상대 경로는 현재 작업 디렉토리를 기준으로 파일 또는 폴더의 위치를 설명하는 경로

4. calculator 패키지 만들기

5. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러확인 및 해결방법

발생에러

ImportError: attempted relative import with no known parent package

해결방법


. 을 삭제

6. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.

상대경로 임포트

ImportError: attempted relative import with no known parent package

절대경로 임포트


ModuleNotFoundError: No module named 'calculator'

해결방법

5

7. init.py 파일의 역할

init.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 만약 game, sound, graphic 등 패키지에 포함된 디렉터리에 init.py 파일이 없다면 패키지로 인식되지 않는다.

※ python3.3 버전부터는 init.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 init.py 파일을 생성하는 것이 안전한 방법이다.

참고
https://wikidocs.net/1418#9595init9595py

0개의 댓글