TIL#40 PYTHON 기초 (20)

Dasom·2020년 8월 22일
0

python

목록 보기
31/50
post-thumbnail

파이썬이 모듈/패키지를 찾는 순서

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

sys.modules 와 sys.path의 차이점

<sys.modules>

  • 파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 곳
  • 딕셔너리 구조
  • 한번이라도 import 된 모듈과 패키지 저장(다시 찾지 않아도 됨)
    ❗️ 새로 import 하려는 모듈은 찾을 수 없음

<sys.path>

  • 마지막으로 찾는 장소
  • string 요소들을 가지고 있는 list
  • 모듈을 찾을 때 참조하는 경로
  • 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인
  • sys.path에서도 모듈을 발견하지 못하면 ModuleNotFoundError 에러를 리턴

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

코드창에서 import sys 를 선언해 sys 모듈을 불러온 후에 sys.modules 를 출력한다. 출력된 딕셔너리 중 첫번째에 'sys': <module 'sys' (built-in)> 이라는 결과를 확인할 수 있다. Built-in modules는 파이썬에서 제공하는 파이썬 공식 라이브러리들이다. Built-in modules은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있다.

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 이라는 프로젝트가 있다고 가정한다.
현재 위치는 my_app 프로젝트 안에 있기 때문에 my_app은 생략한다.

# module2에 있는 함수들을 불러오고 싶다면
from package1 import module2

# module5에 있는 함수들을 불러 오고 싶다면
from package2.subpackage1 import module5

# module3에 있는 함수 function3 을 불러오고 싶다면
from package2.module3 import function3

이런 식으로 파일의 경로를 쭉 쓰면서 찾아가면 된다.

relative path

  • 현재 import 하는 파일의 위치를 기준으로 경로를 설정
  • 경로가 길어지는 단점이 있는 absolute path 의 단점 보완하기 위해 사용
  • dot(.)은 import가 선언되는 파일의 현재 위치
  • 일반적으로 local package 안에서 다른 local package를 import 할때 사용(모듈 안에서만 사용)
ㄴ my_app
   ㄴ main.py
   ㄴ package1
   |   ㄴ module1.py
   |   ㄴ module2.py
   ㄴ package2
       ㄴ __init__.py
       ㄴ module3.py
       ㄴ module4.py
       ㄴ subpackage1
           ㄴ module5.py
# 현재 위치 package2\module3.py

# module4에 있는 class1을 import 하고 싶다면
from . import class1

# module5 에 있는 function3을 import 하고 싶다면
from .subpackage.module5 import function3

# (..) 은 상위 디렉토리로 올라간다
# module2에 있는 함수들을 import 하고 싶다면
from .. import module2
profile
개발자꿈나무🌲

0개의 댓글