Python : How Import Statement Finds Modules & Packages

이지연·2020년 8월 2일
0
post-thumbnail

1. sys.modules 와 sys.path의 차이점을 서술해 주세요.

sys.modules

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

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를 출력할 수도 있고 수정할 수 도 있다.

built-in modules

  • 파이썬에서 제공하는 파이썬 공식 라이브러리들이다.
  • 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있다.

Q. 그렇다면 파이썬은 모듈/package를 어떻게 찾을까? 위의 설명한 3가지 장소를 순서대로 보면서 찾습니다.
sys.modules -> built-in modules -> sys.path

Q. 마지막 sys.path에서도 못찾게 된다면 어떻게 되는가?
sys.path에서도 못찾으면 ModuleNotFoundError 에러를 리턴합니다.


2. sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?

  • sys모듈은 파이썬에 포함되어 있는 내장 모듈이고 파이썬 설치시 기본적으로 내장 모듈에 대한 path정보가 default 값으로 지정되어있다.
  • Sys 모듈도 python에 내장된 built-in 모듈중 하나이므로 경로 검색순서에 따라 쉽게 찾을 수 있다.

3. Absolute path와 relative path의 차이점을 서술해 주세요.

직접 개발한 local package를 import할때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야 한다. local package를 import하는 경로에는 두가지가 있다.

Absolute path

  • 이름 그대로 절대경로를 의미한다.
  • import하는 파일이나 경로에 상관없이 항상 경로가 동일하다

  • my_app => package2 => subpackage1 => module5.py
    : subpackage1의 module5 모듈의 function2 함수를 import 하기 위해서는 다음 경로를 거치게 된다.
  • my_app 프로젝트 내에서는 어느 파일, 어느 위치에서 import하던지 경로가 항상 위와 같이 동일하다. 프로젝트의 최상위단 디렉토리를 기준으로 경로를 잡는다.
  • local package를 import 할때는 absolute path를 사용하면 된다.
  • 단점: 경로가 길어질 수 있다. 이 점을 보완한 것이 relative path이다.

relative path

  • package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import하려고 하면 다음 처럼 할 수 있다.
  • import하는 위치를 기준으로 경로를 정의한다.
  • local package안에서 다른 local package를 import할 때 사용된다.
  • 단점: 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 한다.
    그러므로 absolute path를 사용하는 게 권장된다.

4. calculator 패키지 만들기

5. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지

오류:

Traceback (most recent call last):
  File "c:\Users\PC\Downloads\calculator\main.py", line 5, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package   

import에러로 알려지지 않은 부모패키지를 relative import했기 때문이다.
그래서 아래와 같이 절대경로로 바꿔주어야 한다.

# absoulte path
from calculator.add_and_multiply import add_and_multiply 

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

기본 모듈은 다른 패키지나 모듈을 불러올때 절대경로로 불러와야 한다.
그리고 기본 모듈이 아닌경우는 절대경로든 상대경로든 상관이 없이 불러오면 된다!

사실 이부분이 왜 그렇게 되는지 이유를 정확히 모르겠다...ㅠㅠㅠ
공부를 계속 하면서 내용을 추가적으로 찾아봐야겠다.

7. __init__.py 파일의 역할에 대해서도 정리

  • 패키지를 읽을 때 어떤 처리를 수행해야 하거나 패키지 내부의 모듈들을 한꺼번에 갖고 오고 싶을 때 패키지 폴더 내부에 __init__.py 파일을 만들어 사용한다.
  • 패키지와 관련된 초기화 처리 등을 할 수 있다.
  • 이전 파이썬 3.3 버전에서는 __init__.py파일이 무조건 있어야 패키지로 작동했다. 그러나 이후 버전부터는 __init__.py 파일이 없어도 폴더 내부에 파이썬 파일이 들어 있기만 하면 패키지로 작동한다.
profile
Everyday STEP BY STEP

0개의 댓글