TIL #9 Modules & Packages

tycode·2021년 6월 13일
0

TIL

목록 보기
9/30

Import 순서

파이썬은 모듈/package를 어떻게 찾을까?

파이썬은 다음 3가지 장소를 순서대로 보면서 찾는다.
1. sys.modules
2. built-in modules
3. sys.path

sys.modules

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

built-in modules

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

sys.path

파이썬이 마지막으로 보는 장소이며 기본적으로 string 요소들을 가지고 있는 list들이다.

sys는 어디서 찾을 수 있나?

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

import sys

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

Absolute path * Relative path

파이썬의 built-in 모듈과 pip을 통해 설치한 외부 모듈 및 package는 일반적으로 import하는데 큰 문제가없다.
pip로 설치한 외부 모듈도 자동으로 site-packages라는 디렉토리에 설치가 되고 이 site-packages는 sys.path에 이미 포함되어 있다.

문제는 직접 개발한 local package를 해당 package의 위치에 맞게 import 경로를 선언해야 한다.

그릐고 local package를 import하는 경로에는 absolute path 와 relative path가 있다.

Absolute path

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

예를 들어, my_app이라는 프로젝트에 package1과 package2를 import 한다면

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

이미 my_app 프로젝트 안에 있으므로 my_app은 생략된다.

my_app이라는 프로젝트 내에서는 어느 파일, 어느 위치에서 import하던지 경로가 항상 위와 같이 동일하게 되므로 absolute path라고 한다.

Relative path

일반적으로 local package를 import할 때는 absolute path를 사용하면 된다.
다만 absolute path를 사용하게 되면 경로가 길어진다는 단점이 있다.
이점을 보완하기 위해 relative path를 사용할 수 있다.

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

예를 들어,
package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2함수를 import 하려고 하면 다음과 같다.

# package2/module3.py

from .import class1
from .subpackage1.module5 import function2

여기서 .(dot)은 import가 선언되는 파일의 현재 위치를 뜻한다.
그리고 .. dot 2개는 현재 위치에서 상위 디렉토리로 가능 경로이다.

# subpackage1/module5.py
from ..module4 import class4

relative path는 선언해야 하는 경로의 길이를 줄여주는 장점은 있으나 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있다.

init.py

파일에는 아무코드도 없지만 init파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.

0개의 댓글