python import의 검색 순서

eunji hwang·2020년 4월 3일
0

Import의 검색순서

에서 살펴본 import 에 대해 더 알아보자. import를 통해 모듈과 패키지를 불러오면 어디서 어떻게 가져오는 걸까? 아래 목록을 보자.

  1. sys.modules
  2. built-in modules
  3. sys.path

Import 키워드를 사용함과 동시에 파이썬은 sys.modules > built-in modules > sys.path를 둘러보며 해당 모듈을 찾는다.

sys.modules

sys.modules는 단순한 딕셔너리다. 현재 프로젝트에서 사용하고 있는 모듈과 패키지가 딕셔너리형태로 담겨있다.

built-in modules

빌트인 모듈은 말그대로 내장된 모듈이다. 파이썬을 설치하게 되면 기본으로 제공되는 모듈을 말한다.

sys.path

sys.modules가 딕셔너리 형이였다면 sys.path는 리스트다. path. 이름에서 보이는 것과 같이 경로가 문자열로 담겨 있다. 해당 경로를 하나하나 찾아 들어가 모듈과 패키지를 검색하게 된다.
만약 최종 검색 위치인 sys.path에서도 해당 모듈/패키지를 찾지 못한다면 ModuleNotFoundError를 리턴하게 된다.

sys.moduelsm sys.path 목록보기

import sys

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

sys를 불러온뒤 화면에 출력해 보자. 위 사진과 같이 목록이 출력된다.

파이썬에서 PIP를 통해 패키지를 설치하게 되면 site-packages 디렉토리에 설치가 된다.

위 사진과 같이 sys.path 목록을 출력해보면 site-packages의 경로가 저장되어 있기 때문에 import 하는대 별 문제는 일어나지 않는다.

built-in modules 또한 파이썬 내장 모듈이기 때문에 import 오류문제는 거의 없다.

그렇다면 문제가 되는 경우는 언제일까? 바로 직접 개발한 local package를 사용 할 때이다.


Absolute Path

절대경로(Absolute Path) : import하는 위치/파일에 상관 없이 항상 동일한 경로를 갖는다.

  • 최상위 루트 이하에서 부터 경로를 작성한다.
  • 모든 경로를 작성해야 하기 때문에 경로가 길어질 수 있다

경로 표현법

1) mac/linux

my_app/package2/subpackage1/module5.py

2) window

my_app\package2\subpackage1\module5.py

3) python

my_app.package2.subpackage1.module5.py

위 예제 코드와 같이 파이썬에서는 경로를 (.)dot 을 사용해 표현한다. 루트 디렉토리인 my_app안에서 경로를 작성 하기 때문에 위 경로에서 package2.subpackage1.module5.py 와 같이 my_app을 생략하고 사용한다.

4) 파이썬에서 절대경로로 패키지 불러오기

from package2.subpackage1.module5 import function2
  • import 규칙에 따라 확장자 .py 는 생략하고 작성한다.

Relative Path

상대경로(Relative Path)는 루트 디렉토리 기준이 아닌 import하는 위치 기준으로 경로를 정의한다. 일반적으로 상대경로는 local package안에서 다른 local package를 import 할 때 사용된다.

  • 경로를 짧게 사용 할 수 있다
  • 상황에 따라 경로가 엄청 복잡해 지기도 한다
  • 파일 위치가 변경 될 경우, 각 파일마다 수정해줘야 한다
  • 웬만하면 절대경로를 추천한다

위 프로젝트 트리를 보고 상대경로로 import 해보자

# package2/module3.py

# 현재위치에서 class1 불러오기
from . import class1

# 현재 디렉토리의 subpackage1 > modules5.py 에서 function2 불러오기
from .subpackage1.module5 import function2
# subpackage1/module5.py
# 상위 디렉토리의 module4.py 의 class4 가져오기
from ..module4 import class4

현재 디렉토리 .

`점 1개는 현재 디렉토리를 의미한다

상위 디렉토리 ..

점 2개는 상위 디렉토리를 의미한다.

profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

0개의 댓글