Modules & Packages II

jinatra·2021년 8월 11일
0

Python

목록 보기
13/15
post-thumbnail

Modules & Packages II


Import Search 순서

# example 

import abc

Python이 위의 abc 패키지를 import하려면 해당 패키지가 어디 있는지 찾아야 한다.
파이썬은 아래 세 경로를 순서대로 확인한다.

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


sys.modules

Python이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 장소

sys.modules는 단순한 dictionary 이며, 이미 import된 모듈과 package들을 저장하고 있다.
→ 새로 import된 모듈과 패키지는 찾을 수 없다.


built-in modules

Python에서 제공하는 공식 라이브러리

Built-in modules는 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있다.


sys.path

sys.modulesbuilt-in modules 다음으로 보는 장소

sys.pathstring 요소들을 가지고 있는 list

# example

['',
 '/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']

Python은 위 list를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 패키지가 위치해 있는지 확인


결론

Python은 import 하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈들을 확인 하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾는다.

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


Absolute Path & Relative Path

외부 모듈/패키지 vs 로컬 모듈/패키지

외부 모듈/패키지

파이썬의 built-in 모듈과 pip 을 통해 설치한 외부 모듈 및 package는 일반적으로 import 하는데 큰 문제가 되지 않는다.

Built-in 모듈은 당연히 잘 찾아지고, pip 으로 설치한 외무 모듈도 자동으로 site-packages 라는 디렉토리에 설치가 되는데, 이 site-packagessys.path에 이미 포함되어 있기때문에 찾는데 문제가 없다.


로컬 모듈/패키지

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

Local package를 import 하는 두가지 경로

  • absolute path
  • relative path

Absolute path

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

아래 프로젝트를 예시로 보자.

# example

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

이 프로젝트에서 Absolute path를 사용해 package1package2import 하면 다음과 같다.

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

(경로들의 시작점이 전부 my_app 프로젝트의 최상위 디렉토리에서 시작)

예시로 subpackage1module5 모듈의 function2 함수를 import 하기 위해서는 다음 경로를 거치게 된다.

my_app → package2 → subpackage1 → module5.py

각 OS 별로 위 경로를 표시해보면,

# Linux
my_app/package2/subpackage1/module5.py

# Windows
my_app\package2\subpackage1\module5.py

# Python
package2.subpackage1.module5.py
(my_app.package2.subpackage1.module5.py가 맞지만, 이미 my_app 패키지 안에 있으므로 생략)

from import 키워드를 사용해서 표현해보면 아래와 같다.

from package2.subpackage1.module5 import function2

결론

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


Relative path

상대 경로
import 하는 위치를 기준으로 경로를 정의

일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용

예를 들어, package2module3에서 package2class1package2의 하위 package인 subpackage1module5function2 함수를 import 하려고 하면 아래와 같다.

# package2/module3.py
 
from . import class1
from .subpackage1.module5 import function2

(dot .은 import 가 선언되는 파일의 현재 위치)

현재위치는 package2/module3.py 이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 되는 것!


Absolute path vs. Relative path

가급적이면 Absolute path를 사용해라!

Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있기 때문





Take Away

Import Search 순서 확실히 외우자

sys.modulesbuilt-in modulessys.path

''Python은 import 하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈들을 확인 하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾는다.''

항상 기억하자.. 지금은 어렵다 흑흑


로컬 패키지를 import할 때에는 가급적 Absolute path로!!

이건 그냥 외우자..
Relative path 잘못 쓰면 꼬일거 같다 ㅋㅋㅋ

profile
으악

0개의 댓글