Modules 과 packages

SungjoonAn·2022년 2월 6일
0

파이썬

목록 보기
1/6
post-thumbnail

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

sys.modules

  • 첫번째로 module이나 package를 찾는곳
  • Dictionary구조
  • import 되있는 module과 package 저장 (새로 import하는 module은 sys.modules에서 찾을 수 없습니다.)

sys.path

  • module과 package를 찾고나서 마지막으로 sys.path를 찾음
  • List구조
  • 처음의 list 요소부터 마지막까지 찾음
  • built-in modules
  • sys.path에서도 module을 발견하지 못하면 ModuleNotFoundError를 리턴

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

Python에 포함되어 있는 내장 모듈이고, Built-in 모듈들은 기본적으로 내장 모듈에 대한 path정보가 default 값으로 지정되어있어 python이 쉽게 찾을 수 있습니다.

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

  • Absolute path는 프로젝트 폴더 최상위(root)기준으로 경로가 표시되며, absolute path는 최상위루트부터 경로를 표시해야해서 경로를 길게 표시해야하는 단점이 있다.
  • Relative path는 import된 파일기준으로 경로가 표시되며, absolute path의 단점을 보완하기 위해서 relative path를 사용한다. relative path의 단점은 파일의 위치가 변경되었을 때, 찾을 수 없다는 점이 있다.

4. calculator 패키지 만들기


__init__.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.

main.py

# absoulte path
# from calculator.add_and_multiply import add_and_multiply # relative path
from .calculator.add_and_multiply import add_and_multiply
​
if __name__ == '__main__':
    print(add_and_multiply(1,2))

add_and_multiply.py

from .multiplication import multiply
# from calculator.multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

multiplication.py

def multiply(a,b):
    return(a*b)

5. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고, 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지.

상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러로 ImportError: attempted relative import with no known parent package가 발생한다. 공식문서를 통해서 확인해 보면 python에서 상대경로로 import할 때는 기준점을 잡기 위해 __name__ 변수를 이용한다. __name__ 변수는 모듈의 이름을 저장하고 있는데, main.py 파일에서 조건문 if __name__ == '__main__':의 의미는 현재 모듈이 main module(=시작점)일 경우에 조건을 실행하라는 뜻으로, -m 모듈이름 명령어는 해당 모듈을 sys.path에서 검색하고 그것을 main module로 실행하라는 의미이다.

main 모듈이 있는 프로젝트 폴더 외부에서 main 모듈의 경로를 명시한 뒤 실행하면 에러 없이 결과값이 나온다.

6. _and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.

  1. _and_multiply.py에서 multiply함수를 absolute path로 import
# absoulte path
from calculator.add_and_multiply import add_and_multiply 

# relative path
# from .calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))
    

error 없이 output이 출력 가능하다.

  1. _and_multiply.py에서 multiply함수를 relative path로 import
# from multiplication import multiply
from .multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

print(add_and_multiply(3,9))

출력시 ImportError가 발생한다. main.py때와 같이 main module인 add_and_multiply 모듈의 위치를 잡지 못해 발생하는 에러이다.

  1. _add_and_multiply.py에서 .absolute로 multiply함수 import
from multiplication import multiply
# from calculator.multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

print(add_and_multiply(3,9))

error 없이 output이 출력 가능하다.

7. __init__.py 파일의 역할에 대해서도 정리해주세요.

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

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

0개의 댓글