Assignment#7 [Python] How import statement finds modules and packages

신승호·2021년 4월 18일
0

Assignment

목록 보기
8/8
post-thumbnail

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

sys.module

  • 파이썬이 module이나 package를 찾기위해 가장 먼저 확인하는 곳입니다.
  • sys.modules단순한 dictionary 입니다.
  • 이미 importmodulepackage들을 저장하고 있습니다.
    • 즉, 한번 import된 모듈과 package들은 파이썬이 또 다시 찾지 않아도 됩니다 ~
    • 당연히, 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없습니다.

sys.path

  • 먼저 module찾고, 그다음 package를 찾고 마지막으로 sys.path를 찾음
  • sys.path기본적으로 list이str 요소들을 가지고 있당
  • sys.path에서도 module을 발견하지 못하면 ModuleNotFoundError 에러를 리턴
  • 아래와 같이 리터
>>> sys.path
['/Users/shinisgood/Documents', 
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9', 
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload', 
'/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages']

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

  • sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.
    • sys 모듈built-in module 이며 인터프리터에 내장되어 있다.
    • sys.modulessys.path 에서 위치를 찾을 수 있다.

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

Absolute path

  • 최상단 디렉토리를 기준으로 path 설정.
    • 장점 : 쭉 써놓으니까 헷깔릴 일 없다
    • 단점 : 최상위루트부터 경로를 표시해야해서 경로를 길게 해야한당

Relative path

  • 실행파일이 위치한 디렉토리를 기준으로 path를 설정.
    • 장점 : Relative path는 선언해야 하는 경로의 길이를 줄여준다
    • 단점 : 헷갈리기 쉽고, 파일의 위치가 변경되면 경로 위치도 변경되어야 한다는 단점이 있다.

웬만하면 absolute path를 사용해라

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

  • 동작을 시켰더니 아래처럼 에러가 뜬다 !

    # main.py
    # relative path
    from .calculator.add_and_multiply import add_and_multiply
    
     if __name__ == '__main__':
     print(add_and_multiply(1,2))
    ========================== RESTART:/Users/shinisgood/Documents/main.py ==========================
    Traceback (most recent call last):
      File "/Users/shinisgood/Documents/main.py", line 6, in <module>
        from .calculator.add_and_multiply import add_and_multiply
    ImportError: attempted relative import with no known parent package
    >>> 
    
    >>> 5
    • " 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."
    • 메인 모듈로 사용하려는 것은 absolute path(imports)사용하라함
    # main.py
    # absoulte path
    from calculator.add_and_multiply import add_and_multiply 
    
    if __name__ == '__main__':
        print(add_and_multiply(1,2))

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

  • 상대경로(relative path)으로 돌리면 attempted relative import with no known parent package라는 에러가 뜬다.

  • 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."

  • 즉, main 모듈을 기본 모듈로 사용하기 위해서는 상대경로를 사용해서는 프로그램을 돌릴 수 없다.

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

__init__.py

  • __init__.py파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.
  • Package 안에 __init__.py 파일이 있으면 packageimport 될때, __init__.py 파일의 코드들이 자동으로 실행됩니다.

왜 사용하지 ?

  • Import 할때 경로의 총 길이 줄여주기

    • __init__.py 파일에 먼저 사용할 모듈들을 import 해주면 경로에 따로 모듈 쓸필요가 없지 ?

      # __init__.py
      from .mod1 import func2
      # main.py
      from pkg import func2
      
       func2()
  • Package에서 import 할 수 있는 변수/함수/클래스를 제한할 수 있다.

  • 먼저 import를 한 후 import변수/함수/클래스중 쓰고싶은 것만 __all__이라는 이름의 리스트를 만들어서 따로 저장한다

    • 이 리스트에 들어있는 모듈을 form 패키지이름 import *를 통해 불러올 수 있습니다.
    # __init__.py
    from .mod1 import func2
    from .mod2 import func3
    
    __all__ = ['func2', 'func3']
    # main.py
    from pkg import *
    
    func2()
    func3()
    func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수    없음.
profile
신승홉니다

0개의 댓글