How import statement finds modules and packages

전수현·2021년 6월 14일
0

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

sys.modules

  • 파이썬이 제일먼저 모듈이나 패키지를 찾는곳
  • 딕셔너리구조
  • import 되있는 모듈과 패키지 저장 (다시 찾지 않아도 됨)

sys.path

  • 모듈과 패키지를 1,2를 찾고 마지막으로 sys.path를 찾음
  • 리스트구조(string 요소)
  • 처음의 리스트 요소부터 마지막까지 찾음
  • 파이썬에 포함되어있는 built-in modules
  • sys.path에서도 모듈을 발견하지 못하면 ModuleNotFoundError 에러를 리턴

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

  • 파이썬은 스크립트 실행시 PYTHONPATH, 환경설정, 변수, 위의 모듈들을 순차적으로 실행함
  • 이러한 3RD 파티는 설치시 자동으로 절대경로(""STRING타입)가 설정이되어 찾기 쉬움
  • sys모듈은 이미 built-in 되어 있기 때문에 built-in module들이 있는 부분에서 찾게 된다.
    - 'sys':<module'sys'(built-in)>

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

Absolute path

absolute path는 모듈 및 패키지의 시작부터 끝까지 생략이나 축약되지 않고 명확히 명시된 경로를 뜻한다. 어디에서 쓰든 항상 같아서 사용하는데 헷갈리지 않다는 장점이 있다.

# pkg2/module5.py
# relative path를 적용하기전

from pkg1 import module1
from pkg1.module2 import func3
from pkg2 import module3
from pkg2.pkg4.module6 import func10

경로의 시작점은 해당 module및 패키지 있는 current directory(이 부분은 sys.path에 자동 등록 되어 있다)으로 하기 때문에 main.py가 아닌 어디에서 사용하던 항상 같은 방법으로 쓰면 된다.

Relative path

# pkg2/module5.py
# relative path를 적용하기 전

from pkg1.module2 import func3
from pkg2 import module3
from pkg2.pkg4.module6 import func10

relative path는 최상위 경로가 아닌 현재 자기가 속한 경로를 기준으로 정의한다. 주로 local package안에서 다른 local package를 참조할 때 쓰인다.

# pkg2/module5.py
# relative path를 적용한 후

from ..module2 import func3
from . import module3
from .pkg4.module6 import func10
# pkg4/module6.py
from ..module5 import func_12

absolute path에 비해 간결해 지는 장점이 있지만 프로젝트가 커지고 복잡도가 높아질 수록 혼동이 될 수 있으며 만일 파일의 위치가 바뀌게 되면 그에 맞춰서 path도 재설정 해주어야 한다.

4.calculator 패키지 만들기

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

__init__.py

빈 파일이지만 package임을 알려주는 역할을 함.

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 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.

main.py에서 add_and_mutiply를 상대경로로 임포트 했을 때 아래와 같은 에러가 발생한다.

ImportError: attempted relative import with no known parent package

에러 해결을 위해서는 직접 실행시키는 module에서의 import는 absolute path로 진행하면 된다

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

absolute path와 relative path 모두 실행이 되지 않고 오류 발생
절대경로는 패키지를 인식하지 못하고 상대경로는 알려진 부모패키지가 없이
상대경로 import를 실행한다는 오류가 출력된다.
main 모듈과의 차이점은 name 변수를 확인하는 조건문이 있어서
main 모듈을 실행할 때는 name 변수의 조건문이 이를 만족시켜 print 함수를 실행
add_and_multiply.py 모듈은 absolute path와 relative path 모두 정상적으로 작동이 가능하다.

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

__init__.py 파일은 해당 디렉터리가 패키지의 일부라는 것을 알려주는 역할을 한다.
그러나 python3.3 버전부터는 __init__.py파일이 없어도 패키지로 인식한다.
하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

Python이 처음으로 package를 가져올 때 자동으로 디렉토리 안의 __init__.py에 있는 모든 코드를 실행하게 되므로 package에 있는 파일들에게 필요한 상태를 초기화하기 하는 용도로 설정하여 사용가능하다

파일 내부에 all이라는 리스트를 사용하여 import *을 할 때 불러올 module을 설정하여 원하는 module만 불러올 수 있게 할 수 있다

profile
안녕하세요 :)

0개의 댓글