될때까지

((Python)) How import statement finds modules and packages 본문

프로젝트/wecode

((Python)) How import statement finds modules and packages

랖니 2022. 6. 25. 17:12
728x90

### 과제 ###

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

import sys

print(sys.path)   # str이 담긴 리스트로 출력된다.
print(sys.modules) # 딕셔너리 구조로 출력된다.

sys.modules

  • 파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 곳
  • 딕셔너리 구조
  • 이미 import된 모듈과 패키지들을 저장하고 있음
  • 새로 import하는 모듈은 sys.modules에서 찾을 수 없음

sys.path

  • 가장 마지막으로 확인하는 장소
  • 리스트 구조며 string요소들을 가지고 있음
  • sys.path에서도 모듈을 발견하지 못하면 ModuleNotFoundError를 리턴함

=> sys.modules는 제일 먼저 찾는 곳이고 (그 다음에는 파이썬 built-in모듈을 확인한다.) sys.path는 제일 마지막에 찾는 장소다. 또한 sys.modules는 딕셔너리 구조지만 sys.path는 스트링 요소들을 가지고 있는 리스트 구조로 되어있다는 점이 둘의 차이점이다.

 

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

import sys

print(sys)   # <module 'sys' (built-in)>

=> sys를 출력해보면 built-in 모듈이라고 나온다. 파이썬이 sys를 처음 import할 때 sys.modules에 찾아보지만, 새로 import하는 모듈이니까 찾을 수 없다. 그래서 다음 경로인 built-in모듈에서 찾게 되고 이 때 sys의 위치를 확인할 수 있다.

 

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

https://i-c-a-n-d-o.tistory.com/112

 

개념정리 :: 절대경로 vs 상대경로?

이 블로그에 정리되어있는 모든 개념들은 학습 개념으로 혼자 정리한 내용입니다. 잘못 기술한 부분이 있을 수 있으니 발견하시면 언제든지 지적해주세요😄 🦸‍♀️ 개념정리 - 절대경로(Abso

i-c-a-n-d-o.tistory.com

 

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

* calculator > multiplication.py

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

* calculator > 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)

* main.py

# absolut path 절대경로
from calculator.add_and_multiply import add_and_multiply

# relative path 상대경로
# from .calculator.add_and_multiply import add_and_multiply
# 오류 발생 ImportError: attempted relative import with no known parent package


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

main.py에서 상대경로를 사용하여 import를 했더니 ImportError가 발생했다. 알려진 상위 패키지에서 상대 import를 시도했다. 구글링해봤더니 상대경로를 사용해서 import를 하면 현재 모듈안에 __main__이 설정되어있는 경우 현재 파일의 위치가 루트(최상위) 디렉토리가 된다. 루트 디렉토리에서 .을 찍어서 찾아갈 상위 패키지가 없으므로 에러가 발생한다.

# absolut path 절대경로
from calculator.add_and_multiply import add_and_multiply

# relative path 상대경로
# from .calculator.add_and_multiply import add_and_multiply
# 오류 발생 ImportError: attempted relative import with no known parent package


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

절대경로로 바꿔 실행하면 결과값 5가 제대로 출력이 된다.

 

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

==> 결과는 동일하게 잘 실행이 된다. 기본 모듈은 다른 패키지나 모듈을 import할 때 절대경로를 사용해야하며, 기본 모듈이 아닌 경우는 절대경로, 상대경로 모두 사용할 수 있는 것 같다.

 

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

  • __init__.py파일이 없으면 패키지로 인식을 하지 않기 때문에 __init__.py를 꼭 만들어주는 게 좋음
  • python 3.3버전부터는 없어도 된다하지만 하위버전과 원활한 호환을 위해 생성하는 것이 좋음
  • 패키지안에 __init__.py파일이 있으면 패키지가 import될 때 __init__.py파일의 코드들이 자동으로 실행된다.
  • __init__.py파일에 먼저 사용할 모듈들을 import해주면 다른 파일에서 import할 때 경로의 길이가 줄어든다.

 

 

https://www.youtube.com/watch?v=vhzdwoJangI

728x90