Python - How Import Statement Finds Modules & Packages

황인용·2019년 12월 12일
0

Python

목록 보기
32/44

Import Search 순서

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

sys.module

파이썬이 package나 module을 찾기위해 제일 먼저 확인하는 것이 sys.module이다
sys.module은 단순한 dictionary 이다.
그리고 이미 import된 module과 package들을 저장하고 있다.
즉, 한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 된다.
따라서 새로 import하는 모듈은 sys.module에서 찾을 수 없다.

built-in modules

파이썬에서 제공하는 파이썬 공식 라이브러리들이다
Built-in modules는 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 접근 및 찾을 수 있다.

sys.path

마지막으로 보는 장소가 sys.path이다
sys.path는 기본적으로 list이며, string element들을 가지고 있는 list이다.

['',
 '/Users/song-eun-u/anaconda3/bin',
 '/Users/song-eun-u/anaconda3/lib/python36.zip',
 '/Users/song-eun-u/anaconda3/lib/python3.6',
 '/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
 '/Users/song-eun-u/.ipython']

따라서 파이썬은 list의 각 경로 하나하나 확인하면서 해당 경로에 import 하고자하는 package들의 위치를 확인한다

참고로 sys는 파이썬에 포함되어 있는 module이다. 그러므로 다음처럼 sys를 import 해서 sys.module과 sys.path를 확인 할 수 있다.

import sys

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

만약 import하고자 하는 module이나 package가 있다면, 먼저 sys.modules를 보고, 다음으로 built-in modules을 확인 그리고 마지막으로 sys.path를 통해 경로로 들어가 찾고자 하는 module 또는 package를 찾는다.
만약 sys.path 통해서도 찾고자 하는 module이 없을 경우 ModuleNotFoundError 를 리턴합니다.

Absolute Path & Relative Path

파이썬에서 sys.module과 built-in module은 pip와 외부 module 설치로 인해 원하는 package나 module를 찾는 데 큰 문제가 되지 않는다.
pip로 설치한 외부 module은 자동으로 site-packages라는 디렉토리에 설치되는데, 이 site-packages는 sys.path에도 저장이 되어 찾는데 문제가 없다.

하지만 문제는 내가 직접 개발한 local package이다. 직접 개발한 local package를 import할때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야 한다.

경로를 선언할때에는 'Absolute Path' 와 'Relative Path'가 있다.

예를들어 다음과 같은 한 프로젝트 보면...

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

my_app 이라는 프로젝트안에는 package1과 package2를 갖고 있다.
그리고 package2에는 subpackage2라는 중첩 package를 가지고 있다.

여기서 package2의 subpackage1의 module5의 function2를 import하고자 한다면...

from package2.subpackage1.module5 import function2

사실상 경로를 보면 다음과 같다

my_app => package2 => subpackage1 => module5.py

이걸 리눅스의 directory 경로 형식으로 바꾸면 다음처럼 표현 할 수 있다

# 리눅스 형식
my_app/package2/subpackage1/module5.py

윈도우스 형식

# 윈도우스 형식
my_app\package2\subpackage1\module5.py

파이썬형식

# 파이썬 형식
package2.subpackage1.module5.py

다시 from import 키워드로 import한다면

# import
from package2.subpackage1.module5 import function2

여기서 Absolue Path는 말그대로 절대 경로로 my_app이라는 프로젝트안에서 절대 변하지 않는 경로를 말한다.
일반적으로 local packeage를 import할때 absolute path를 사용하여 import하면 된다.

absulute path사용시 단점은 경로가 길어진다는 점이다.

이에 비해 Relative Path는 최상단 디렉토리 기준으로 경로를 잡는것이 아니라 import하는 위치를 기준으로 경로를 정의한다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할대 사용한다.

# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

상위 디렉토리를 선언해줄수 있다.

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

Assignment

1. sys.modules와 sys.path의 차이점을 서술해주세요
:
sys.module은 파이썬이 module이나 package를 찾을 때 가장 먼저 확인하는 곳으로, dicitonary 형태로 구성되어 있다.
sys.path는 파이썬이 마지막으로 보는 장소로, string 요소들을 가지고 있는 list 형식으로 구성되어 있다.

2. sys도 inmport 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?
:
sys는 파이썬에 기본적으로 포함되어 있는 module로, sys.module 디렉토리 또는 sys.path 경로를 확인하여 module의 위치를 확인 할 수 있다.

3. Absolute Path와 Relative Path의 차이점을 서술해 주세요.
:
Absolute Path는 절대적인 경로로, module이나 package를 import 할때 최상위 경로부터 선언하여야한다. 일반적으로 local package를 import할때 사용한다.
Relative Path는 상대적인 경로로, module이나 package를 import 할때, 현재 자신의 위치를 기준으로 상대적인 경로를 선언한다. 일반적으로 local package안에 다른 local package를 import할때 사용한다

profile
dev_pang의 pang.log

0개의 댓글