Modules & packages

정현석·2020년 10월 27일
0

1. sys.modules 와 sys.path의 차이점을 서술해 주세요.

  • sys.modules : 파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳, 단순한 dictionary입니다. 그리고 이미 import된 모듈과 package를 저장하고 있습니다.

    • 한번 import된 모듈과 package들은 파이썬이 다시 찾지 않아도 되도록하는 기능을 가지고있습니다.
      그러므로 새로 import하는 모듈은 sys.modules에서 찾을 수 없습니다.
  • sys.path : 파이썬이 마지막으로 보는 장소이며, 기본적으로 list이며 string요소들을 가지고 있는 list입니다.
    각 string요소들은 경로들이있어, 파이썬은 list의 각 경로를 하나하나 확인하면서 해당 경로에 import하고자 하는 package가 위치해 있는지 확인합니다.

    파이썬은 import하고자 하는 모듈과 package를 찾을 때 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈 확인, 마지막으로 sys.path에 지정되어 있는 경로들을 확인합니다.
    sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴합니다.

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

  • 각 경로를 하나한 확인하면서 해당 경로에 impor하고자 하는 package가 위치해 있는지 확인합니다.
    sys 모듈을 import 하여 sys.modules와 sys.path를 출력할 수도 수정 할 수 도 있습니다.
import sys

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

3. Absolute path와 relative path의 차이점을 서술해 주세요.

  • 직접 개발한 local package에 적용할 때 해당 package의 위치에 맞게import 경로를 선언해야합니다.
    local package를 import하는 경로에 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 이라는 프로젝트 이며 package1과 package2 라는 2개의 package를 가지고 있습니다.
    그리고 package2는 subpackage2 라는 중첩 package를 가지고 있습니다.
  • Absolute path를 사용해 package1 과 package2를 import 하면 다음과 같습니다.
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

경로들의 시작점이 전부 "my_app" 프로젝트의 가장 최상위 디렉토리에서 시작합니다. my_app프로젝트 내에서는 어느 파일, 어느위치에서 import하던지 경로가 항상 동일하게 되므로 absolut path라고 합니다.

  • 한가지 단점은 바로 경로가 길어질 수 있습니다.

이런 단점을 보완하기 위해 relative path를 사용합니다

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

  • 예를 들어, package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import하려고 하면 다음 처럼 할 수 있습니다.

# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

여기서 dot(.)은 import가 선언되는 파일의 현재 위치를 이야기 합니다. 현재위치는 package2/module3.py 이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 되는 것입니다.

또한 dot 2개를 사용할 수도 있습니다.  dot 2개(..) 는 현재위치에서 상위 디렉토리로 가는 경로입니다.

# subpackage1/module5.py
from ..module4 import class4

Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있습니다. 그러므로 웬만한 경우 absolute path를 사용하는게 권장 됩니다.
  1. calculator 패키지 만들기
  2. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고
    다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.
  • error 코드 :attempted relative import with no known parent package

import 에러 , 부모패키지가 없다라 나온다.

모식도를 보면 calculator와 main은 같은 폴더안에 있다. 그렇기 때문에 상위폴더로 가더라도 찾을 수가 없다!!

  • 상대경로는 현재모듈에 기반으로 찾아 main모듈은 항상 main이기 때문에 메인 목적의 main모듈들은 반드시 절대 경로를 사용해야 한다.

init 파일의 역활
init 파일은 아무것도 없어도 그 자체가 package의 시작점을 의미한다.

  • init파일에도 코드를 추가하여 관리할 수 있다.
profile
기록하는 벨로그

0개의 댓글