모듈과 패키지 #1

chaerin·2021년 1월 18일
0

PYTHON

목록 보기
16/17
  • 모듈 : 특정 기능을 .py 파일 단위로 작성한 것. 각종 변수, 함수, 클래스를 담고 있는 파일이다.
  • 패키지 : 특정 기능과 관련된 여러 모듈을 묶은 것. 패키지는 모듈에 네임스페이스(namespace, 이름공간)을 제공한다.
  • 파이썬 표준 라이브러리 : 파이썬에 기본으로 설치된 모듈과 패키지, 내장 함수를 묶어서 파이썬 표준 라이브러리라고 한다.

모듈아니 package를 불러와 사용하기 위해서 import라는 키워드를 사용한다.
import <모듈/package 이름>

Import Search 순서

파이썬은 모듈이나 package를 찾을 때 다음의 순서대로 찾는다.
sys.modules -> built-in modules -> sys.path

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

sys.modules

모듈이나 package를 찾기 위해 가장 먼저 확인하는 곳으로 dictionary이다.

이미 import된 모듈과 package를 저장하고 있다.(새로 import된 모듈은 sys.modules에서 찾을 수 없다.)

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

sys.path

string 요소들을 가지고 있는 list이다.

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

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

import sys

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

sys를 import하고 print하여 확인해 보면

'sys': <module 'sys' (built-in)>

built-in 되어 있는 모듈임을 확인할 수 있다.

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

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

Absolute path

절대 경로이다. import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다.

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

my_app 이라는 프로젝트이며 package1과 package2 라는 2개의 package를 가지고 있다.
그리고 package2는 subpackage1 라는 중첩 package를 가지고 있다.
absolute path를 사용해 package1과 package2를 import하면 다음과 같다.

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

경로들의 시작점이 전부 "my_app" 프로젝트의 가장 최상위 디렉토리에서 시작하는 것을 볼 수 있다. 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는 것이다.

일반적으로 local package를 import 할때는 absolute path를 사용하면 된다.

✔️ absolute path를 사용하게 되면 한가지 단점이 있는데 바로 경로가 길어질 수 있다는 점이다. 이러한 단점을 보완하기 위해 relative path를 사용한다.

Relative path

absolute path와 달리 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import하는 위치를 기준으로 경로를 정의한다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import할 때 사용된다.

예를 들어, package2의 module3에서 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import하려고 하면 다음처럼 할 수 있다.

# package2/module3.py

from .subpackage1.module5 import function2

dot(.)은 import가 선언되는 파일의 현재 위치를 이야기한다. 현재위치는 package2/module2.py이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 되는 것이다.

또한 dot 2개를 사용할 수도 있습니다. dot 2개(..) 는 현재위치에서 상위 디렉토리로 가는 경로이다.

# subpackage1/module5.py

from ..module4 import class4

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

🔆 따라서 absolute path를 사용하는것을 권장한다.

0개의 댓글