15. TIL (Module, Path)

조금은 어려운 개념인 Module과 path에 대해 알아보자아!


1. Module & Packages

: 변수나 함수, 클래스 등을 모아놓은 파일.

  • 모듈을 사용하는 이유? : 다른 파일에서 재사용하기 위해
    전체 코드가 한 파일에 넣기에는 너무 커져서 여러 파일로 나누어 정리를 하기 위해
  • 모듈을 불러오는 방법 : import < 모듈 이름>
    파일 확장자인 .py 제외하고 파일 이름만 사용하여 import 해야함!
  • 모듈의 형식 : namespace 구조
    모듈의 이름을 앞에 붙여주어야 파이썬이 어느 파일을 봐야 해당 함수를 찾을 수 있는지 알 수 있다.
    <모듈 이름>, <모듈에서 사용하길 원하는 변수/ 함수 / 클래스 이름>
    my_module.my_module_func() : my_module의 my_module_func 함수를 호출
  • import keyword 이외 from ... import... keyword를 사용해 모듈을 불러올 수 있다.
    모듈에서 사용하는 것이 명확할 때 사용하면 편리하며,
    모듈 이름을 붙이지 않고 곧바로 원하는 함수, 변수, 클래스를 호출할 수 있다.
    * 을 사용하면 모듈의 모든 요소가 import 되지만,
    local scope를 가지고 있는 다른 변수/함수/클래스들과
    이름 충돌이 날 경우 알기 어렵기에 권장하지 않는 방법.
  • 여러모듈을 import 하는 경우 ? : import as 키워드로 새로운 이름을 준다!
    ex) my_module 에서 my_module_func 함수와 my_module_var 변수를 import 한다면?
    from my_module import my_module_func, my_module_var
    print(my_module_var)
    my_module_func()
    from my_module import *  : 한 줄로 표현하면 깔-끔
    ex) import as 사용하기
    from my_module import My_func as f1
    from my_module2 import My_func as f2
    from my_module3 import function_with_name_long as f3
    import my_module as m1
    m1.my_module_func()

2. Packages

  • 모듈과 마찬가지로 다른 파일에서 불러와 사용하는 개념이지만 모듈보다 크고 복잡한 코드!

  • 여러 파일에 나누어져있는 코드들도 하나의 모듈로 불러와 사용할 수 있게 해주는 것이 패키지.

  • Package는 파이썬 파일들로 이루어져있는 디렉토리가 하나의 Package가 되며, 디렉토리의 이름이 Package의 이름이다!

  • 사용 시, import로 불러오며, 클래스 객체를 사용할 때 처럼 원하는 모듈을 import 해야한다!

    import pkg.mod1
    from pkg.mod2 import func2
    
    pkg.mod1.func2()
    func2()
  • 초기 설정이 필요할 때 __init__.py 파일을 통해 가능.
    : Package 안에 init.py 파일이 있으면 package import 시 코드들이 자동으로 실행됨

  • __init__.py 파일의 역할 :

    • Import 시, 경로의 총 길이 줄여줌
      ex) mod1의 func2를 import
      # __init__.py
      from .mod1 import func2
      .# main.py
      from pkg import func2
      func2()
  • Package에서 Import 할 수 있는 변수/함수/클래스 제한
    : 함수가 패키지 내부에서 import 되어 사용되는 것을 막기 위해 __all__.py 변수 지정 가능
    __all__.py 변수의 defalut 값은 모든 함수/ 변수 / 클래스.
    그렇기에 변수를 따로 정의해 import 될 수 있는 요소를 제한할 수 있으며,
    __all__.py변수는 string 값의 요소를 가지고 있는 list!
    import 되길 원하는 요소를 string으로 list에 선언해주면 된다.
    ex)

    .#__init__.py
    from .mod1 import func2
    from .mod2 import func3
    __all__ = ['func2' , 'func3' ] 
    .#main.py
    from pkg import +
    func2()
    func3() 

3. 파이썬은 모듈과 패키지를 어떻게 보고 찾는가!?

  • 3가지의 장소를 순서대로 보면서 찾는다!

    sys.modules -> bulit-in-modules -> sys.path

3-1. sys.modules

  • 파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 곳
  • sys.modules은 dictionary로 이미 import된 모듈과 패키지들을 저장해둠
  • 한 번 import된 모듈과 패키지는 다시 찾지 않아도 되는 기능이 있지만,
    새로 import 하는 module은 sys.modules에서 찾을 수 없다. 3-2. bulit-in-modules
  • 파이썬에서 제공하는 공식 라이브러리들. 이미 파이썬에 포함되어 나옴

3-3. sys.path

  • 모듈과 패키지를 찾기 위해 가장 마지막으로 보는 장소.
  • 기본적으로 list이며 string 요소들을 가지고 있음!
  • 파이썬은 리스트의 각 경로를 하나하나 확인하며 해당 경로에 import 하고자 하는 패키지가 위치해 있는지 확인한다!
  • sys.modules과 sys.path를 출력 / 수정할 수 있음

3-4. Absolute path와 relative path

  • 절대경로와 상대경로. (자세한 설명은 하단 차이점에서 -! )

ex) 프로젝트 예시

  • Absolute path를 사용해 package1과 package2를 import하면?

  • Absolute path 경로 표현하기

    my_app => package2 => subpackage1 => module5.py
    my_app/package2/subpackage1/module5.py : 리눅스의 directory 경로 형식
    my_app\package2\subpackage1\module5\.py : 윈도우 형식
    my_app.package2.subpackage1.module5.py : 파이썬의 경로 표현 방식
    (my_app)은 이미 프로젝트 안에 있으므로 생략 가능
  • 파이썬의 경로를 from import keyword를 사용해 import 하게 되면?
    from package2.subpackage1.module5 import fucntion2

  • Relative path 예시
    ex) package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import 하려고 한다면?

  • . dot은 import가 선언되는 파일의 현재 위치를 가르킴.
    현재 위치에서부터 원하는 모듈의 경로만 선언해주면 됨!
    .. dot 2개도 사용이 가능함 => 상위 디렉토리로 가는 경로로 사용됨


Assignment

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

:

  • import 하고자 하는 모듈과 package를 찾을 때 먼저 sys.modules 을 보고,
    없다면 bulit-in 모듈을 확인하고, 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾는다! 못찾으면 ModuleNotFoundError 를 리턴함
  • sys.path: pip를 통해 설치한 외부 모듈은 자동으로 site-packages라는 디렉토리에 설치되고, 이 내용이 sys.path에 포함

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

: list의 경로를 하나하나 확인하며 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인하며 찾아낸다!

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

  • Absolute path : 절대경로. import 하는 파일이나 경로에 상관없이 항상 경로가 동일함.
    모든 경로의 시작점이 가장 최상위 디렉토리. 일반적인 Local package를 import 할 때 사용하면 됨
    경로가 길어질 수 있다는 단점이 있음
  • Relative path : import 하는 위치를 기준으로 경로를 정의함. 일반적으로 relative path는 local package에서 다른 local package를 import 할 때 사용됨. 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 한다는 단점이 있음
  1. calculator 패키지 만들기 => 추후 포스팅 진행 예정!

좋은 웹페이지 즐겨찾기