[python] 파이썬이 import한 모듈과 패키지를 찾는 과정

Jay·2020년 2월 9일
2

파이썬에서는 import로 간단하게 모듈이나 패키지를 소환해 사용할 수 있다. 그 과정에 대해서 공부했다.

파이썬이 모듈, 패키지를 검색하는 순서

아래의 순서를 차례로 따른다

sys.modules
built-in modules
sys.path

  1. sys.modules
    이미 로딩된 패키지와 모듈을 딕셔너리 형태로 저장하고 있다. 그래서 처음 import한 패키지나 모듈은 sys-modules 탐색 중에는 찾을 수 없다. idle에 sys.modules를 타이핑하면 볼 수 있는데, {'모듈명': '경로'} 의 형태로 구성되어 있다.

  2. built-in modules
    파이썬에서 제공하는 공식 라이브러리들로, 이미 내장된(built-in) 모듈들이다. sys-module과 마찬가지로 쉽게 찾을 수 있다.

  3. sys.path
    string요소로 모듈의 경로를 list형태로 저장하고 있다. 직접 만든 모듈이나 패키지를 사용하고 싶다면, append를 사용하면 된다.

import sys
sys.path.append('경로')
-
import append한 파일 명

sys.path에서도 import한 모듈을 찾을 수 없으면 ModuleNotFoundError 오류가 발생한다.

import mod2
ModuleNotFoundError: No module named 'mod2'

python은 sys 모듈의 위치를 찾는 방법

몇몇 모듈은 파이썬에 이미 내장되어있는 sys모듈도 그 중 하나다. 위의 순서를 따르자면 built-in 모듈에 존재하고 있기 때문에 sys를 import할 수 있는 것이고, 다른 모듈과 패키지를 사용할 수 있는 것이다. 실제로 idle에서 sys.moduels를 타이프하면 딕셔너리의 맨 처음에 sys가 등장하고 built-in된 모듈 임을 알 수 있다.

absolute path와 relative path

absolute path와 relative path의 차이는 경로의 시작점이다. absolute path는 프로젝트의 최상단 디렉토리를 기준으로 하고, relative path는 현재 import하는 위치를 기준으로 삼는다. 그러다보니, absolute path는 경로가 길어진다는 단점이 있고, relative path는 위치를 한 눈에 파악하기 어렵다는 단점이 있다. 그래서 relative path는 local package에서 다른 local package를 import할 때 사용된다.
이런 경로를 가진 프로젝트가 있다고 가정해보자.

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py
<absolute path>
from package2 import module3
from package2.subpackage1.module5 import function2

absolute path는 기준 디렉토리가 정해져 있기 때문에, 같은 모듈이나 함수를 import한다면 현재 작업하는 파일의 위치가 어디든 상관없이 모듈을 소환하는 경로가 같다.

<relative path>
# package2/module3.py
from . import class1  #1
from .subpackage1.module5 import function2 #2
# subpackage1/module5.py
from ..module4 import class4 #3

relative path는 기준 디렉토리가 현재 작업하고 있는 파일의 디렉토리이기 때문에, 파일이 다르다면 경로도 각각 다르다.
#1 : package2의 module3에 있는 class1
#2 : package2의 subpackage1의 module5 에 존재하는 function2
#3 : package2의 module4에 있는 class4
#1, #2의 경우 현재 작업하는 module3이 package2에 존재하기 때문에 경로가 package2 기준이고, #3의 경우 module4앞에 ..이 있는데 현재 작업하는 subpackage1의 상위 폴더인 package2를 기준으로 한다는 의미다.

profile
You're not a computer, you're a tiny stone in a beautiful mosaic

1개의 댓글

comment-user-thumbnail
2021년 2월 18일

감사합니다 찾고있었던 정보였는데 간단해서 쉽게 이해했어요!

답글 달기