Python TIL(19) - Module & Package

random·2021년 4월 20일
0

Python - TIL

목록 보기
17/19

파이썬 모듈 & 패키지 학습기록

다양한 파일에서 필요한 기능을 추출해서 쓸 수 있도록 돕는 모듈과 패키지를 살펴보자!

1. Sys.module vs sys.path

  • sys 모듈이란? :
    파이썬 sys 모듈은 파이썬 런타임 환경의 다양한 부분을 변경할 수 있는 함수와 변수로 이루어져있다. 짧게 말해, sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.

  • 아래 이미지는 dir() 함수를 써서 sys 모듈 내에 정의된 모든 attribute 요소를 문자열과 리스트 형태로 출력한 결과이다. 어트리뷰트의 종류와 수가 엄청 많다는 것이 확인된다.


  • sys.modules 란? :
    sys.modules은 앞선 최상위 sys 모듈에서 정의된 수 많은 attribute 중 하나이다. 위 캡처한 이미지 파일 중후반 쯤에서 찾아 볼 수 있다.

  • 주요 기능으로, 이미 한 번 이상 import가 된 모듈을 해당 모듈명을 활용하여 (동시에, dictionary상 기능을 이용하여) 찾는 역할을 한다. 한 번 이상 사용되었거나 이미 내장 되어 있는 module이나 패키지만 존재하므로 새롭게 import 되는 것은 없다고 볼 수 있다.

  • sys.modules 상 저장된 {'키':'값'} 딕셔너리 형식의 수 많은 모듈들

  • sys.modules 내부 attribute 이미지 파일

  • sys.path란? :
    sys.path는 sys.modules 처럼 sys (1번 항목 이미지에 나와있듯), sys 모듈에 속한 내장 변수이고, 인터프리터가 필요한 모듈이 있을시 탐색하게되는 디렉토리의 리스트를 반환한다.
  • 어떤 한 모듈이 파이썬 파일상에서 import가 되면, 파이썬 인터프리터는 가장먼저 해당 모듈을 빌트인 모듈에서 찾는다. 발견 실패시, sys.path에서 정의된 디렉토리 리스트에서 찾게 된다.

  • sys.path가 품고 있는 디렉토리 주소 출력결과

  • sys.path 모듈 내에 정의된 많은 메소드 함수들


2. Absolute Import vs Relative Import

  • Import란?:
    Import는 파이썬내 다른 파일이나 모듈이 또 다른 파일이나 모듈에 접근을 가능하게 하는 기능을 한다. 예를들어, 수학적인 기능을 구사하고 싶을 때에는 math 관련 패키지를 우선적으로 import 해야만한다. 이는 파이썬에서는 사용하려 하는 모든 것을 먼저 정의/선언 내리고 시작해야 되는 특징에서 기인한다.
  • 'Import'를 통해 파일과 모듈에 접근하기 까지 아래의 여러 과정을 거친다.

    (1) 이전에 이미 import된 코드가 있는지 확인차 sys.modules에서 모듈/패키지를 탐색하고,
    (2) 그 후에 파이썬 표준 라이브러리를 검색한다.
    (3) 만약 원하는 모듈을 찾지 못하면, 전체 저장공간을 훑는 과정을 거치는데 이때, 현재 디렉토리에서 부터 system.path에 리스팅되어 있는 디렉토리까지 포함된다.
    (4) 만약 모듈이 그 과정속에서 발견된다면 프로그램에 해당 모듈을 추가하고 그렇지 않다면 ModuleNotFoundError라는 메세지가 뜨게 된다.

  • Aboslute Import(절대경로를 통한 Import):

    • Absolute Import는 프로그램의 root 폴더에서 부터 뿌리내려지는 전체 경로를 요구한다.
    • 각각 폴더를 (.) 온점으로 분류해야 하며 원하는 만큼 길게 늘어뜨려놓을 수 있다.
    • Absolut Import의 장/단점:
      • 장점: 내가 사용하고자 하는 파일의 정확한 위치가 파악 가능. 따라서 코드 어디에서나 사용가능함.
      • 단점1: 파일 디렉토리 주소가 너무 길어질 수 있음. 만일 해당 디렉토리 주소가 코드 한줄이 넘어갈 경우 상대경로를 사용하는 것이 나을 수 있음.
      • 단점2: 파이썬 인터프리터가 시작파일의 현재 폴더를 sys.path 패키지 root로 선언한다는 특성 때문에, root 폴더상의 파일을 돌리려하면 문제가 없겠으나, 프로그램 시작점이 하위폴더이거나 sys.path가 변하는 환경에서 문제가 발생 할 수 있다. 이 때, root 폴더는 하위 폴더로 변하기 때문에 해당 하위폴더 밖의 그 어떤 파일도 import 접근이 불가한 상황이 발생하게 됨.
  • Relative Import(상대경로를 통한 Import):

    • 상대 import란 현재 파일의 위치를 기준삼아 상응하는 디렉토리 주소를 활용한 import를 뜻한다.
    • 상대 import를 위해서는 맥운영채제 기준 Unix 기반의 터미널 창에서 흔히 사용되는 ('.' : 현재위치), ('..' : 상위폴더)를 사용해서 현재 폴더와 상위 폴더의 디렉토리를 표현 가능하다.
      예시: from. import xxx, from .. import yyyy
    • Relative Import의 장/단점:
      • 장점: 절대경로를 이용한 import에 비교해 더욱 짧게 표현이 가능하다.
      • 단점: 상하위를 기반으로 추정가능한 모듈의 자세한 위치가 불명확하기 때문에 단독 개발자로서 만들어낸 파일에서는 문제가 없겠지만, 팀 단위로 일을 수행해야 할 때는 잦은 혼선을 빚을 수 있다.
  • Absolute vs Relative:
    - 여러 층의 패키지로 이루어진 거대한 프로젝트에 투입된게 아니라면, absolute import를 사용하는 습관을 들여야 한다. 그로써 다른 개발자들의 이해를 도울뿐만 아니라 팀 전체의 개발 효율도 높아진다.


3. 간단한 계산기 만들기 실습

  • multiply.py라는 간단한 곱셈 함수 역할을 하는 파이썬 파일을 만든다

  • 위 곱셈함수를 같은 폴더 내에서(.multiply: 현재 폴더에 위치한 multiply 파이썬 파일 이란 뜻) 호출하고 덧셈 속성을 추가하는 add_and_multiply.py를 만든다

  • main.py에서 상대경로를 이용하여 add_and_multiply 함수를 실행시켜 보았으나 실패함. 그 사유는, 상대경로는 현재 모듈을 기준으로 모듈/패키지를 찾기 때문에, main 모듈은 항상 메인이라서 반드시 절대 경로를 사용해야 정상 작동하기 때문이다.

  • 위 에러를 아래와 같이 절대경로로 수정하여 성공적으로 실행함. 입력 값(5,9)을 서로 곱한 값에 서로 더한 값을 더한 최종결과(59)를 성공적으로 반환함.


4. _init_.py 파일이 하는 일

  • __init__.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.
    • 패키지에는 init.py 라는 특별한 파일이 있는데, 이 파일은 기본적으로 그 폴더가 일반 폴더가 아닌 패키지임을 표시하기 위해 사용될 뿐만 아니라, 패키지를 초기화하는 파이썬 코드를 넣을 수 있다. 버젼 3.3 이상에서는 이 파일이 없어도 패키지로 사용할 수 있지만, 호환성을 위해 두는 것이 좋다. init.py 파일에서 중요한 변수로 all 이라는 리스트 변수가 있는데, 이 변수는 "from 패키지명 import *" 문을 사용할 때, 그 패키지 내에서 import 가능한 모듈들의 리스트를 담고 있다. 즉, all 에 없는 모듈은 import 되지 않고 에러가 발생한다.
      (설명 출처: http://pythonstudy.xyz/python/article/18-패키지)
  • 아무것도 적혀 있지 않았지만 위 계산기 파일의 정상작동을 도운 __init__.py의 예시:

0개의 댓글