[TIL] Modules & Packages

SEUNGCHAN BAEK·2021년 3월 21일
0

TIL

목록 보기
6/15

1. sys.modulessys.path의 차이점

sys.modules

  1. 파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳이다.
  2. sys.modules은 단순한 dictionary 형태이다.
  3. 이미 import된 모듈과 package를 저장하고 있다.
  4. import가 되어있는 모듈과 패키지의 경로가 저장되어 있어 다시 찾지 않아도 된다. (새로 import 하는 모듈은 sys.modules 에서 찾을 수 없음)

sys.path

  1. 파이썬이 마지막으로 보는 곳이다.
  2. sys.path는 기본적으로 list형태이며 string 요소들을 가지고 있는 list 이다.
  3. 각 list의 경로를 하나하나 확인하면서 해당 경로에 import하고자 하는 package가 위치해 있는지 확인한다.

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

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

Absolute pathrelative path의 차이점

absolute path는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 동일하게 되므로 absolute path 라고 한다.

  1. Absolute path는 최상단 디렉토리를 기준으로 path 설정.

  2. Absolute path는 최상위 루트부터 경로를 표시해야 하므로 경로가 길어질 수 있다.

Relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의한다.

  1. Relative path는 실행파일이 위치한 디렉토리를 기준으로 path를 설정한다.

  2. Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고, 파일의 위치가 변경되면 경로 위치도 변경되어야 한다는 단점이 있다.

absolute path를 사용하는것을 권장!

calculator 패키지 만들어 보기

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

https://docs.python.org/3/tutorial/modules.html#intra-package-references

파이참 환경에서 실행시켜보니 ImportError: attempted relative import with no known parent package 라는 오류 메세지가 나온걸 확인할 수 있다.

위에 나와있는 파이썬 공식 홈페이지에 들어가보면,

상대경로로 import 시 현재 module의 이름을 기반으로 한다. main 모듈의 이름은 항상 "main"이기 때문에, 파이썬 어플리케이션은 항상 절대경로를 사용해야 한다고 나와있다.

위 문구처럼 calculator 파일구조에서 main은 package에 속한 파일이 아니다. 그렇기 때문에 main.py가 속한 module은 'main'이 된다.
결국 절대경로로 calculator package를 최상단 디렉토리로 언급해야한다.

from calculator.add_and_multiply import add_and_multiply

이렇게 수정해야 한다.

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점은 무엇인가?

(상대경로)
from .multiplication import multiply

(절대경로)
from calculator.multiplication import multiply

둘다 실행된다.

기본 모듈은 다른 패키지나 모듈을 불러올때 절대경로로 불러와야 하며 기본 모듈이 아닌경우는 절대경로든 상대경로든 상관이 없다.

init.py 파일의 역할

init.py란 디렉토리가 패키지로 인식되도록 하는 역할도 하고, 이름 그대로 패키지를 초기화하는 역할을 한다. 즉, import로 패키지를 가져오면 init.py 파일이 실행되므로 이 파일에서 from . import 모듈 형식으로 현재 패키지에서 모듈을 가져오게 만들어야 한다.

디렉터리에 __init.py 파일이 없다면 패키지로 인식되지 않을 수 있다.

하지만, 3.3부터는 init 이 없어도 인식 가능하다.

profile
백엔드 개발자가 되는 그날까지

0개의 댓글