(Python) How import statement finds modules and packages

Kepler·2020년 1월 31일
0

Import Search 순서

Import할 모듈이나 패키지를 찾을때 파이썬은 다음 3가지 장소를 순서대로 찾는다.

1. sys.modules

2. built-in modules

3. sys.path

sys.modules

  • dictionary 형태
  • 과거에 import된 모듈/패키지를 저장 => 다음에 사용할때 다시 찾아도 되지 않음
  • 따라서, 새로 import하는 모듈은 여기서 찾을수 없음

built-in modules

  • 파이썬이 제공하는 공식 라이브러리들
  • 예) list의 len등

sys.path

  • list 형태의 단순 string
  • list의 모든 element를 하나씩 확인하며 import하고자 하는 모듈을 찾음
  • sys.path에 없는경우, ModuleNotFoundError 에러를 리턴
  • pip 으로 설치한 외부 모듈은 sys.path의 site-packages 라는 디렉토리에 설치 됨
#sys.path 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/.ipython']

Absoulte and Relative Path

local package를 import할 경우 absoulte 과 relative path 둘 중의 하나를 사용하여 import경로를 선택해야 한다.

Absoulte Path

  • 최상단 디렉토리를 기준으로 import하는 파일이나 경로에 상관없이 항상 동일한 절대경로
    • 예를들어, 인터넷에서 사진을 다운로드 했을때, 매번 윈도우즈의 C: | Desktop | My Documents | Photos 를 통해서 Photos 폴더에 파일을 저장하는 것과 같다(?)
  • 장점: 헷갈리지 않아 권장되는 방법이며, 주로 사용됨
  • 단점: 경로가 길어짐
# Linux에서의 absoulte path 지정하기 
my_app/package2/subpackage1/module5.py


#Python (from import 키워드 사용한 import)
from package2.subpackage1.module5 import function2  #.(닷) 사용

Relative Path

  • import하는 위치의 기준으로 경로를 정의
    • 윈도우즈에서 사진을 다운받을 때 경로를 입력하는 대신, 이미 있는 디렉토리에서 화살표를 클릭하여 원하는 디렉토리를 설정하는것 같은 느낌
  • 일반적으로 local package안에서 다른 local package를 import할 때 사용
  • 장점: 경로가 간단
  • 단점: 헷갈리며, 파일 위치가 변경될때마다 바꿔야함
# module3.py에서 module3의class1 의 경로 선언
#  pkg2 / module3.py
from . import class1 #.(닷) 한개 = 현재경로기준

#module3.py에서 module5.py 의 function2 경로 선언
from .subpkg1.module5 import function2

#module3.py에서 module1.py의 function5 경로 선언
from ..pkg1.module1 important function3

Python sys module

  • sys: 파이썬을 설치하면 기본으로 제공되는 표준 라이브러리
    • sys.modules 와 sys.path는 이 모듈에 속해있다
  • local module과 같이 sys module 도 import가 필요
import sys

Q. 파이썬은 sys의 위치를 어떻게 찾을 수 있을까?

A. sys 모듈에는 파이썬 인터프리터와 인터프리터가 실행중인 환경, 즉 시스템(system)에 관련된 기능들이 담겨 있다.

import sys 를 실행하는 시점에서, 파이썬은 sys 모듈을 찾기 시작하고, sys는 내장 모듈이므로, 파이썬이 이미 어디서 이것을 불러와야 하는지 알고 있기에 찾을수 있다.

참고링크:

Wecode Repl.it 송은우님 작성 Python - How Import Statement Finds Modules & Packages
https://automatetheboringstuff.com/chapter8/
http://byteofpython-korean.sourceforge.net/byte_of_python.html

profile
🔰

0개의 댓글