How Import Statement Finds Modules & Packages

백승찬·2020년 10월 25일
0

python

목록 보기
2/10

Import Search순서

1. sys.modules

모듈이나 패키지를 찾기위해 가장 먼저 확인하는 곳!
sys.modules는 단순한 딕셔너리로 되어있다.
이미 import된 모듈과 패키지들을 저장하고있음
그리고 한번 import된 모듈과 패키지는 파이썬은 다신 찾지 않으므로
새로운 import하는 모듈은 못 찾음

2. built-in modules

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

3. sys.path

sys.path는 기본적으로 list나 string 요소들을 가지고 있는 list

각 string 요소들

['',
 '/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 하고자 하는 패키지가 위치에 있는 지 확인

기본적으로 sys는 파이썬에 포함되어 있는 모듈

import 하고자 하는 모듈과 패키지를 찾을 때는 먼저 sys.modules를 보고 built-in 모듈을 확인 그리고 마지막으로 sys.path를 순서로 찾아야함

*sys.path에서도 못 찾으면 ModuleNotFoundError 에러를 리턴

Absolute Path & Relative 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
패키지1과 패키지2라는 패키지를 두개 가지고 있습니다. 그리고 패키지2에는 중첩 패키지인 서브패키지를 가지고 있습니다.

import 예시 (Absolute Path 사용)

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

가장 최상위 디렉토리에서 사용됨

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

로컬 패키지를 import 할때는 absolute path를 사용하면 되지만 단점으로 경로가 길어질 수 있다는 점

이점을 보완하기 위해 등장하는 relative path는 절대 경로와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는 게 아니라 import하는 위치를 기준으로 경로를 정의
일반적으로 relative path는 로컬 패키지안에서 다른 로컬 패키지를 import 할때 사용됨

ex)

# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

패키지2의 모듈3에서 패키지2의 clas1과 패키지2의 하위 패키지인 서브 패키지1의 모듈5의 function2 함수를 import하려고 하면 예시처럼 된다.

relative path는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로의 위치도 변경 되어야 하는 단점이 있습니다 ㅠㅠ

sys.modules와 sys.path의 차이점

sys.modules의 경우는 파이썬에서 제일 먼저 모듈이나 패키지를 찾는 공간입니다. 그리고 또한 딕셔너리 구조로 존재 하고 import됨 모듈과 패키지 저장을 하고 이와같은 경우에는 파이썬에서 다시 찾지 않아도 사용됩니다.

sys.path의 경우는 모듈과 패키지를 찾은 후 마지막으로 sys.path를 찾습니다. 그리고 또한 리스트 구로로 존재하고 처음 요소부터 마지막까지 찾게되고 만약 sys.path 구간에서도 찾지 못하게 된다면 ModuleNotFoundError 에러를 리턴합니다.

sys도 import 해야하는 모듈인데 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을 까?

sys모듈은 built-in 되어 있기 때문에 built-in module들이 있는 부분에서 찾을 수 있다.

Absolute path와 relative path의 차이점

Absolute path : import를 하는 파일이나 경로에 상관없이 항상 경로가 동일

relative path : 절대 경로와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는 게 아니라 import하는 위치를 기준으로 경로를 정의

calcurator 모듈의 임포트 했을 때 발생하는 에러 확인 후 수정

부모 디렉토리를 인식하지 못하여 절대경로로 바꾸어 인식하게 수정

init.py 파일의 역할에 대하여 정리

패키지 초기 설정을 할 수 있게 해주는 역할 그리고 또한 파일의 존재하는 패키지의 일부임을 알려주는 역할

0개의 댓글