modules and packages

가비·2020년 8월 25일
0

sys.modules 와 sys.path

  • sys.modules
    - 파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳.
    - dictionary 구조.
    - 이미 import된 모듈과 package들을 저장.
    - 한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 되도록 하는 기능.
    - 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없음.

  • sys.path
    - 파이썬이 모듈이나 package를 찾기위해 마지막으로 보는 장소.
    - 기본적으로 list이며 string 요소들을 가지고 있는 list.(각 string 요소들은 경로를 나타냄)
    - 파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인.

sys import

sys 모듈은 내장 모듈이기 때문에 확장자가 py인 형태로는 찾을 수 없다.(C언어로 프로그래밍되어 파이썬에 내장)
sys 모듈은 파이썬의 모듈에 관련된 정보를 몇가지 가지고 있는데
'파이썬 내장모듈 목록'이 그 중 하나이다.

import sys
print(sys.builtin_module_names)

여기에 없다면 sys.path에 정의되어있는 디렉토리에서 모듈파일을 탐색하기 시작한다.

Absolute path와 relative path

  • Absolute path(절대 경로)
    - import를 하는 파일이나 경로에 상관없이 항상 경로가 동일.
    - 일반적으로 local package를 import 할때는 absolute path를 사용.
    ! absolute path를 사용하게 되면 경로가 길어질 수 있다.
  • Relative path
    - absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로 정의.
    - 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용.
    ! 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 함.
    💡 그러므로 웬만한 경우 absolute path를 사용도록 권장.

calculator 패키지

main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러

ImportError: attempted relative import with no known parent package

name이 main인 모듈에서 패키지의 다른 모듈을 import하기 위해서는 항상 절대 경로(absolute path)를 사용해야함.

why? 상대경로는 실행 스크립트를 기준으로 경로를 설정하는 방식이다. 그래서 main module 에서 상대경로를 지정하면 현재 스크립트 명 기준이 아닌 "main" 이라는 모듈명을 기준으로 경로를 찾는다.
그러나 사용자가 정의한 모듈명은 "main"이 아니므로 경로에서 오류가 발생하게 된다. main module 에서는 반드시 상대경로가 아닌 절대경로를 사용하여 모듈이나 패키지를 import 해야한다.

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점

add_and_multiply.py 파일은 실행중인 파일(main)이 아니기 때문에, 어떠한 경로로 muriplication 모듈의 multiple 함수를 가져와도 상관이 없다.

init.py

해당 디렉터리가 패키지의 일부라는 것을 알려주는 역할.
만약 init.py 파일이 없다면, calculator라는 패키지를 패키지라고 인식을 못하게 된다.
!but python3.3 버전부터는 init 파일이 없어도 패키지로 인식 하지만 하위 버전 호환을 위해 파일을 생성하는 것이 안전.

0개의 댓글