Python : 모듈과 패키지

Psj·2020년 10월 27일
0

Python

목록 보기
12/41

sys.modules 와 sys.path의 차이점

sys (System-specific parameters and functions)란?

sys는 파이썬에서 제공하는 모듈인데 OS모듈안에 있으며 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할수있게 해주는 모듈입니다. built-in modules에서 찾을수 있습니다.

파이썬에서는 아래와같은 순서대로 호출합니다.

sys.modules -> built-in modules -> sys.path

sys.module

  • 파이썬이 제일먼저 모듈 또는 패키지를 찾는곳
  • 딕셔너리구조
  • import 되있는 모듈과 패키지 저장 (다시 찾지 않아도 됨)

sys.path

  • 모듈과 패키지를 1,2를 찾고 마지막으로 sys.path를 찾음
  • 리스트구조(string 요소)
  • 처음의 리스트 요소부터 마지막까지 찾음
  • 파이썬에 포함되어있는 built-in modules
  • sys.path에서도 모듈을 발견하지 못하면 ModuleNotFoundError 에러를 리턴

python이 sys 모듈의 위치를 찾는 방법

몇몇 모듈은 파이썬에 이미 내장되어있는데 sys모듈도 그중 하나입니다. sys는 built-in 모듈에 존재하고 있기때문에 import할수 있고 다른 모듈과 패키지를 사용할수 있는 것입니다.

Absolute path(절대경로)와 relative path(상대경로)의 차이점

Absolute path

Absolute path는 이름 그대로 절대 경로 입니다. 왜 절대 경로이냐하면 import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하기 때문입니다. 아래의 코드를 보면 경로들의 시작점이 전부 "my_app" 프로젝트의 가장 최상위 디렉토리에서 시작하는것을 볼 수 있습니다.

from package1 import module1
from package1.module2 import function1
from package2 import class1

relative path

Relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용됩니다.

calculator폴더 오류파악 및 수정

현재 폴더에 이렇게 저장되어있다.


main.py를 실행햇을때 위와 같은 오류가 발생한다.

from .calculator.add_and_multiply import add_and_multiply
이 코드를 아래와같이 앞에 . 을 빼서 상대경로를 없애주면 정상적으로실행된다.
from calculator.add_and_multiply import add_and_multiply

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로로 각각 실행하기

상대경로로 실행했을때
아래와 같은 에러가 발생한다.

ImportError: attempted relative import with no known parent package

절대경로로 실행했을때
정상결과가 나온다.

다른결과가 나오는이유

상대경로로 임포트를 하는 방식은, 패키지 계층의 구조에서 현재 모듈의 위치를 결정하기 위해 __name__에 의존합니다. 주 모듈에서 __name__ 의 값은 항상 __main__ 이므로, 명시적 상대경로 지정은 실패합니다.

__init__.py의 역할

__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 만약 sound, graphic 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않습니다.

※ python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식합니다. 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

profile
Software Developer

0개의 댓글