본문 바로가기

Data_Analysis_Track_33/Python

Python_06(Package&Module)

모듈 : 독립적인 일을 할 수 있고 재사용 가능한 프로그램 단위
- 파이썬에서의 모듈은 재사용 가능한 함수, 클래스등(변수)을 작성한 소스파일(.py 스크립트 파일)을 말한다.
- 모듈의 함수나 클래스들을 다른 python 프로그램에서 호출 하여 사용할 수 있다. -> 단 사용하기 위해서는 import 를 먼저 해야 한다.
- 이런 모듈들을 모아 놓으면 라이브러리가 된다.
모듈의 종류
표준 모듈 : 파이썬에 내장된 모듈
사용자 정의 모듈 : 개발자가 재사용을 위해 직접 만든 모듈
3rd Party 모듈 : 특정 개발업체나 개발자들이 만들어 배포하는 모듈 (설치가 필요함 -> pip ~)
- 사용자 정의 모듈도 배포되어 다른 곳에서 사용되면 3rd party 모듈이 된다.

패키지 : 모듈들을 모아 놓은 것 (모듈 파일들이 모여 있는 디렉토리)
- 파이썬에서는 라이브러리를 패키지라고 한다.
Root Package : 전체 모듈들을 담고 있는 최상위 패키지(디렉토리)

# 모듈 - calculator.py (계산함수를 제공하는 모듈)

# 주피터노트북 명령어 -> 매직커맨드
# 매직커맨드는 line 1에 위치해야한다. 주석보다도 위에 위치해야함.
%%writefile 저장할파일경로 -> cell에 작성한 내용을 파일에 저장.
%load calculator.py -> cell에다가 py파일의 내용을 불러오기

 

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

 

%load calculator.py

%load calculator.py 실행시 위에서 입력한 calculator.py의 내용들이 같은 셀에 입력된다.

%%writefile my_package/test_module.py

def greet(name):
    return f"{name}님 안녕하세요."

def gugudan(dan):
    for i in range(1, 10):
        print(f"{dan} X {i} = {dan * i}")
        
class Person:
    def __init__(self, name, age):
        self.age = age
        self.name = name
        
    def __str__(self):
        return f"이름 : {self.name}, 나이 : {self.age}"

 

import : 파이썬 모듈 파일에 정의된 변수, 함수, 클래스들을 사용하기 위해 파이썬 실행환경에 등록하는 작업을 말한다.
-> 현재 스크립트가 아닌 다른 파일에 정의된 변수, 함수, 클래스들을 사용하기 위해서 파이썬 실행환경에 등록하는 작업
구문 : [from 사용할 것의 경로] import 사용할 것 [as 별칭] [, 사용할 것..]  ([ ] : 생략 가능한 구문)
사용할 것 : 모듈, 모듈안에 정의된 변수, 함수, 클래스

# calculate.py 모듈을 import
import calculator
# calculate 모듈의 함수를 호출 -> 모듈명.함수명()
r = calculator.plus(1, 2)
r2 = calculator.minus(100, 200)
print(r)
print(r2)

 

print(calculator.divide(100, 5))

 

import calculator as calc # import는 calculator.py 하는데 사용할 때는 calc로 사용하겠다.
print(calc.plus(1,2))
print(calc.multiply(1,2))

 

# my_package/test_module.py를 import
# 현재 실행중인 모듈이 있는 디렉토리(패키지)에서 찾는다.
import my_package.test_module 

print(my_package.test_module.greet('홍길동'))
p = my_package.test_module.Person('이름', 20)
print(p)

 

import my_package.test_module as tm

print(tm.greet('이순신'))

 

p2 = tm.Person('홍길동', 30)
print(p2)

 

from my_package import test_module # my_package 모듈의 test_module 모듈을 불러온다.

test_module.greet('유재석')

 

from my_package import test_module as tm2 # my_package 모듈의 test_module 모듈을 tm2라는 별칭으로 불러온다.
tm2.greet('유재석')


모듈내의 특정 항목만 import
from 모듈 import 함수 : 함수/클래스가 있는 모듈과 함수를 분리해서 import한다.
- 모듈에 정의된 일부 함수나 클래스만 사용할 경우 개별적으로 import 할 수있다.
- from 모듈 import 함수 구문으로 import 하면 import한 함수나 클래스들이 현재 실행중인 모듈의 namespace로 들어간다. 그래서 모듈명없이 바로 호출 할 수 있다.
- *를 이용하면 그 모듈의 모든 함수/클래스들을 현재 실행중인 namespace에 추가해 사용할 수 있게 해준다. 이 방식은 이름 충돌의 가능성이 있기때문에 추천되지 않는다.

# 모듈안의 특정 함수나 클래스들을 import
from calculator import plus # calculator 모듈의 plus 함수만 import하겠다.
plus(100,200)

 

def plus(): # 또 다른 plus()함수를 정의한다면?
    print('덧셈')

 

import calculator as calc
calc.plus(10, 10)

 

plus()

 

from calculator import plus # plus()함수가 calculator에 있는 plus()함수로 덮어씌워진다.

 

plus() # 실행 시 오류가 발생하며 모듈 calculator의 plus()함수로 인식하여 arguments를 입력하라고 한다.

 

plus(10, 20) # 실행이 된다.

# from calculator import plus, minus, multiply, divide
from calculator import *                             # 위와 같은 코드 문법적으로 가능하지만 하지 않는게 좋다.
multiply(10, 20), divide(30, 10)


한번 import한 모듈은 재(re) import가 안됨. -> 모듈에 변경점이 생기면  다시 import를 해서 바뀐 내용을 확인해야 하는데 확인할 수 없다.
-> tool를 restart하는 방법도 있지만, 커널(kernel)을 restart하면 더 간단히 해결할 수 있다. (jupyter lab의 시계방향으로 회전하는 모양)
- 스크립트에서는 이런 문제가 발생하지 않는다.