Modules & Packages_python

Jungyub Song·2020년 4월 24일

1. sys.modules 와 sys.path의 차이점

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

1) sys.modules
sys.modules는 기본적으로 dictionary이며, 이미 import된 module과 package들을 저장하고 있다.
그렇기 때문에 한번이라도 import된 module과 package들은 파이썬에서 다시 찾지 않아도
된다는 특징을 가지고 있으며, 반대로 새로 import하는 module과 package는 sys.modules에서 찾을 수 없다.

2) 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 하고자 하는 package가 위치하여 있는지 확인한다.
sys.path에서도 module과 package를 찾지 못하면 ModuleNotFoundError를 리턴하게 된다.

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

sys는 파이썬에 포함되어 있는 module이다. 이미 built-in되어 있기 때문에 built-in modules 부분을 확인하는 과정에서 찾게 된다. 다음과 같이 sys를 import 해서 sys.modules와 sys.path 를 출력할수도 있고 수정 할 수도 있다.

import sys

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

3. absolute path와 relative path의 차이점

두 path 모두 직접 개발한 local package를 import하기 위한 경로라는 공통점이 있지만, 아래와 같은 차이점도 존재한다.

1) absolute path
import하는 파일이나 경로에 상관없이 항상 동일한 경로를 통해 불러오기 때문에 local package를 import 할때는 일반적으로 absolute path를 사용한다.

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

하지만 경로가 길어질 수 있다는 단점이 있고, 이를 보완하기 위해 아래와 같이 relative path를 사용할 수 있다.

2) relative path
relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라, import 하는 위치를 기준으로 경로를 정의한다. 때문에 local storage 안에서 다른 local storage를 import할 때 주로 사용한다.

#현재 위치에서부터 원하는 모듈의 경로 (.)
#package2/module3.py
from . import class1
from .subpackage1.module5 import function2
#상위 디렉토리로 가는 경로 (..)
#subpackage1/module5.py
from ..module4 import class4

relative path가 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만, 파일 위치가 변경되면 경로 위치도 변경되어야 하며, 직관적으로 보기에 헷갈리기 쉽기 때문에 일반적으로 absolute path를 사용하는 것을 권장한다.

0개의 댓글