Data_Analysis_Track_33/Python

Python_06-2(Package&Module, import)

lsc99 2023. 8. 23. 17:48

여러 개의 스크립트 파일을 사용하면서 모듈들이 함수들을 사용한다면, 하나의 모듈에 재사용 가능한 함수들을 모아놓고 다른 모듈들에서 call해서 사용하자
함수, 클래스, 변수들을 모아놓은 것이 파일(모듈)이라 한다면, 파일들을 모아 놓은 것이 패키지(디렉토리)이다. 그리하여 완성된 패키지를 배포한다.

모듈 run.py, calc.py가 있다면 (run.py는 실행모듈이며, calc.py는 함수들을 모은 기능모듈이라고 가정)
my_module이라는 패키지 안에 a.py와 b.py가 있다면(a.py와 b.py는 기능 모듈이라고 가정)


run.py 코드

import calc  # calc.py의 함수들을 사용 -> calc함수명()
import my_module.a as a     # my_module에 있는 a를 a라는 별칭으로 사용하겠다.
from my_module import a    # my_module에 있는 a를 import하겠다. -> 이 방식으로 import 함수 호출할 때 a.a1()처럼 할 수 있다.

# from my_module import a as 가, b as 나  # my_module에 있는 여러개를 import할 수 있으면 별칭을 지정할 수 있다.
# from my_module.a import a1, a2  # my_module 패키지 안에 있는 a 모듈의 a1과 a2 함수를 사용하겠다. 
          # 이 방식으로 import 하면 현재 모듈에서 정의한 함수처럼 함수명만 쓸 수 있다. a1()
          # from 패키지명 import 클래스 or 함수 하면 namespace가 필요 없다.

calc.plus()
calc.minus()

my_module.a.a1()
a.a1()         # my_module.a.a1()을 다 치기 힘들면 별칭을 지정후 별칭.함수명()을 통해 함수를 호출하자
# 관례로 별칭을 정해서 사용하는 함수들도 있기에 관례에 따르자 ex) pandas as pd, numpy as np

 

패키지에 속한 모듈 import

from Root패키지.Sub패키지1.Sub패키지2 import 모듈        # 패키지가 계층구조로 되있을 경우 `.` 으로 이용해 나열한다.
from Root패키지.Sub패키지1.Sub패키지2.모듈 import 함수
from Root패키지.Sub패키지1.Sub패키지2.모듈 import 클래스

결론 : from 경로(모듈) import 사용할 것(변수, 함수, 클래스)
        from 경로(패키지) import 사용할 것(변수, 함수, 클래스, 모듈)



import 된 모듈 찾는 경로 및 PYTHONPATH
import 모듈 구문을 사용하면 파이썬 실행 환경은 모듈을 다음 경로에서 찾는다.
1. 현재 실행중인 모듈(import 구문을 사용한 모듈)이 있는 경로
2. 파이썬 실행환경에 등록된 경로
모듈을 찾는 순서는 다음에서 확인할 수 있다.

import sys      # 표준모듈 sys, 파이썬 내장 모듈, 표준(내장)모듈은 import 후에 사용할 수 있다.
print(sys.path) # 모듈을 찾는 경로를 저장한 list -> 리스트의 경로 순서대로 찾는다.



위의 경로 이외에 파이썬 모듈이 있을 경우 PYTHONPATH 환경변수에 그 디렉토리 경로를 등록한다.
1. sys.path 에 추가한다. (사용할 때 마다 추가해야 한다.)

sys.path.append(r"c:\lib") # 임시적으로 경로를 추가한다.


2. 운영체제 환경변수에 등록한다. (한번만 하면된다.) 환경변수에 추가한뒤에는 한번만 프로그램을 껏다가 키면 된다.(프로그램을 킬 때 환경변수를 읽어들이기 때문)

메인 모듈(Main Module)과 하위 모듈(Sub Module)
메인 모듈 : 현재 실행하고 있는 모듈
- python 모듈.py 로 실행된 모듈을 말한다.(터미널 창에서)
- application 의 main logic을 처리한다.

하위 모듈 (Sub module) : 메인 모듈에서 import 되어 실행되는 모듈
- 모듈을 import하면 그 모듈을 실행 시킨다. 이때 모듈에 있는 실행코드들도 같이 실행된다. 이것을 방지 하기 위해 모듈이 메인 모듈로 실행되는지 하위 모듈로 실행되는지 확인이 필요하다.

__name__ 내장 전역변수 : 실행 중인 모듈명을 저장하는 내장 전역변수
- 메인 모듈은 '__main__' 을 하위 모듈은 모듈명(파일명) 이 저장된다.
- 모듈이 메인 모듈로 시작하는지 여부 확인 할 때 사용한다.
if __name__ == '__main__':
    # 메인모듈일 때만 실행할 코드 블록

%%writefile calculator.py

def plus(n1, n2):
    return n1 + n2

def minus(n1, n2):
    return n1 - n2

def multiply(n1, n2):
    return n1 * n2

def divide(n1, n2):
    return n1 / n2

if __name__ == '__main__':
    # 아래코드는 main모듈로 실행될 때만 실행한다.
    print('모듈이름')
    print(__name__) # python 실행환경이 제공하는 모듈의 이름을 저장하는 변수

    r1 = plus(10, 20)
    r2 = minus(100, 20)
    r3 = multiply(1, 7)
    r4 = divide(10, 2)
    print(r1, r2, r3, r4)

 

# import 모듈 -> 모듈을 실행시킨다.
import calculator as calc
calc.plus(10, 10)
print(calc.r1) # 메인 모듈로 실행할 때만 실행되기 때문에 import로는 calc.r1의 값을 얻을 수 없다.

 

메인 모듈로 실행하려면 Windows PowerShell이나 cmd 창에서 calculator가 있는 경로로 들어간 뒤,

python calculator.py를 입력하면 if __name__ == '__main__': 의 조건이 충족되어 if문 아래 코드들이 실행된다.


import 구문, 메인 모듈과 서브 모듈의 개념 이해하는 것이 중요