Python - How Import Statement Finds Modules & Packages

ybnr_92·2020년 6월 9일
0

Python

목록 보기
23/29

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


import search 순서
sys.modules -> built-in modules -> sys.path

sys.modules

  • 파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳.
  • sys.modules은 단순한 dictionary형태.
  • 이미 import된 모듈과 package를 저장하고 있음.
  • import가 되어있는 모듈과 패키지의 경로가 저장되어 있어 다시 찾지 않아도 된다.

sys.path

  • 파이썬이 마지막으로 보는 곳.
  • sys.path는 기본적으로 list형태이며 string 요소들을 가지고 있는 list
  • 각 list의 경로를 하나하나 확인하면서 해당 경로에 import하고자 하는 package가 위치해 있는지 확인함.

정리

  • 위에 import search순서에서도 언급하였지만 다시 한번 정리를 해보자면.
  • 파이썬은 import하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고 없으면 파이썬 built-in 모듈들을 확인하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾음.
  • sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴함.

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


  • 파이썬에 포함되어 있는 내장 모듈이고 파이썬 설치시 기본적으로 내장 모듈에 대한 path정보가 default 값으로 지정되어있다.
  • Sys 모듈도 python에 내장된 built-in 모듈중 하나이므로 경로 검색순서에 따라 쉽게 찾을 수 있다.

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


  • Absolute path는 최상단 디렉토리를 기준으로 path 설정.

  • Absolute path는 최상위루트부터 경로를 표시해야해서 경로를 길게 표시해야하는 단점이 있다.

  • Relative path는 실행파일이 위치한 디렉토리를 기준으로 path를 설정.

  • Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고, 파일의 위치가 변경되면 경로 위치도 변경되어야 한다는 단점이 있다.
    그러므로 웬만한 경우에는 absolute path를 사용하는게 권장된다.

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



동작을 시키니 이렇게 나온다.
그래서 공식문서 <-클릭) 를 확인해보니

이렇다고 한다. 그냥 막 번역기를 쓰다 보니 구문이 어설픈데

  • 절대 가져오기는 대략 Absolute path(절대경로)를 말하는 것과
    상대 가져오기,상대적 가져오기는 relative path(상대경로) 대략 이것인 걸로 보인다.
  • 마지막 줄에 기본 모듈로 사용하려는 모듈은 항상 절대 가져오기를 사용해라고 적혀있다.Absolute path(절대경로) 이것을 말하는 듯.
    그래서 기존에 되어있던relative path 부분을 주석처리를 하고

    이렇게 absoulte path 부분을 살려 주었다.
    그랬더니

    결과값이 출력이 잘 되는 걸 볼 수 있다.

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


상대경로로 출력을 한 경우



절대경로로 출력을 한 경우


  • 위에 공식문서를 봤듯이 상대경로는 현재 모듈의 이름을 기반으로 함.
  • 기본 모듈의 이름은 always "__main__" 이므로 python 응용 프로그램의 기본 모듈로 사용하려는 모듈은 항상 절대경로를 사용해야함.
  • main모듈을 기본 모듈로 사용하기 위해서는 상대경로를 사용해서는 프로그램을 돌릴 수 없다.

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


패키지를 읽을 때 어떤 처리를 수행해야 하거나 패키지 내부의 모듈들을 한꺼번에 가져오고 싶을 때가 있습니다. 그럴때는 패키지 폴더 내부에
__init__.py파일을 만들어 사용합니다.


  • 패키지를 읽어 들일 때 __init__.py를 가장 먼저 실행합니다.
  • 패키지와 관련된 초기화 처리 등을 할 수 있습니다.
  • __init__.py에서는 __all__이라는 이름의 리스트를 만드는데 이 리스트에 지정한 모듈들이 form<패키지이름>import 를 할 때 전부 읽어 들여집니다.
  • 파이썬 3.3 이전 버전에서는 __init__.py파일이 무조건 있어야 패키지로 작동했지만, 이후 버전에서는 __init__.py 파일이 없어도 폴더 내부에 파이썬 파일이 들어 있기만 하면 패키지로 작동합니다.
profile
yoonbitnara.github.io

0개의 댓글