Python- modules and packages(2)

DONGHYUN KOO·2020년 8월 24일
0

python

목록 보기
17/19

How import statement finds modules and packages


파이썬은 다음 3가지 장소를 순서대로 보면서 찾습니다.

  1. sys.modules
  2. built-in modules
  3. sys.path

sys.modules

파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳입니다.
sys.modules는 단순한 dictionary 입니다. 그리고 이미 import된 모듈과 package들을 저장하고 있습니다.
즉, 한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 되도록 하는 기능을 가지고 있습니다.
그러므로 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없습니다.

built-in modules

파이썬에서 제공하는 파이썬 공식 라이브러리들 입니다.
Built-in 모듈들은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있습니다.

sys.path

마지막으로 보는 장소가 바로 sys.path 입니다.
sys.path는 기본적으로 list이며 string 요소들을 가지고 있는 list 입니다.
각 string 요소들은 다음 처럼 경로를 나타냅니다:

1.sys.modules 과 sys.path의 차이점

sys.modules
sys.modules은 파이썬이 모듈이나 패키지를 찾기위해 가장 먼저 확인하는 디렉터리.
이미 import된 모듈과 패키지를 저장하고 있음

sys.path
sys.path는 파이썬이 sys.modules에 없으며, built-in module이 아닌 모듈/패키지를 마지막으로 찾아보는 장소
string으로 이루어진 리스트 형태이며,
각 string은 모듈/패키지의 경로를 나타냄

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

  • sys.modules라는 디렉터리를 살펴봅니다.

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

  • Absolute Path (절대경로)
    루트부터 시작해서 해당 파일/폴더의 위치를 명시하는 것

  • Relative Path (상대경로)
    현재위치(.)부터 시작해서 해당 파일/폴더의 위치를 명시하는 것

5.

부모 패키지가 정의되어있지 않은 상태에서 상대 경로로 import를 시도해서 발생한 import error다.

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

절대경로로 import 경로를 정의해줄 것.

파이썬 공식문서를 참고해보면 다음과 같이 권고하는데,
Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.
즉, 상대 경로 import는 현재 모듈의 이름을 기반으로한다. 기본 모듈의 이름은 항상 main이므로 Python 응용 프로그램의 기본 모듈로 사용하려는 모듈은 항상 절대 가져 오기를 사용해야한다. 이제 위의 내용들을 참고하여 절대 경로로 변경하여 오류를 해결 후 결과를 출력해보자.

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

  • add_and_multiply.py와 main.py의 차이는 위치에 있다. 그에 따른 역할의 차이가 존재한다.

  • add_and_multiply.py는 패키지 내부 파일로 사용당하는 파일이다. 그러나 main.py는 실제로 패키지와 모듈을 가져와 함수를 쓰는 파일이다.
    그로 인해 단독 실행 가능 여부에 있어서도 차이를 보인다.
    또한 python 자체에서 import할 때 main 모듈에서는 상대 경로로 접근하는 것을 막아 놓았다.

7. init.py 파일의 역할

init.py가 존재하는 디렉토리는 패키지의 일부임을 알려주는 역할을 한다.
package 초기 설정을 할 수 있는 역할을 한다.

  1. init.py 파일이 존재하지 않는다면 패키지의 일부인지 인식을 하지 못하기 때문에 속성을 가지고 있지 않는다는 에러가 발생하게 된다.
  2. 현재는 init.py파일은 빈 파일이지만 package 실행 시 설정해주고 싶은 초기 설정이 있다면 이 파일에 초기 설정에 관련된 코드들을 작성해준다. 그러면 작성 한 코드의 내용대로 package 실행 시 자동으로 실행된다.

0개의 댓글