10. 모듈 & 패키지

 10. 모듈 & 패키지


10-1. 모듈


필요한 것들 끼리 부품처럼 만들어진 파일

함수 정의나 클래스 등의 파이썬 코드들을 담고있는 파일(확장자 .py)


<사용예시> - 영화 티켓 판매 모듈 만들기

사람수에 따른 영화티켓 가격을 출력하는 함수들을 담고있는 모듈

def price(people): #일반 영화티켓은 인당 만원
print("{}명 가격은 {}원".format(people, people * 10000))

def price_morning(people): #조조 영화티켓은 인당 6천원
print("{}명 조조 가격은 {}원".format(people, people * 6000))
def price_soldier(people): #군인 영화티켓은 인당 5천원
print("{}명 군인 가격은 {}원".format(people, people * 5000))

위와 같이 'cinema_modile.py'라는 모듈파일을 생성했다.  모듈을 불러 와서 사용하려면 모듈파일과 같은 경로에 있거나 라이브러리들이 모여있는 폴더에 모듈파일이 있어야 한다. 


<다양한 모듈 사용 방법들>

1)

import cinema_module

cinema_module.price(3)
cinema_module.price_morning(2)

<실행결과>

3명 가격은 30000원

2명 조조 가격은 12000원


2)

import cinema_module as mv #사용하고자 하는 모듈을 'mv'로 호출

mv.price(3)
mv.price_morning(2)

<실행결과>

3명 가격은 30000원

2명 조조 가격은 12000원


3)

from cinema_module import * #해당 모듈 안의 모든 것 사용

price(3)
price_soldier(4)

<실행결과>

3명 가격은 30000원

4명 군인 가격은 20000원


4)

from cinema_module import price, price_morning
#해당 모듈 안에서 해당하는 함수만 불러옴

price(3)
price_soldier(4) #불러올 함수에 해당하지 않아서 에러 발생

<실행결과>

3명 가격은 30000원

에러


5)

from cinema_module import price_soldier as price
#해당 모듈 안의 해당함수를 'price'로 호출

price(4) #price()가 아닌 price_soldier()가 실행됨

<실행결과>

4명 군인 가격은 20000원



10-2. 패키지


모듈들을 모아놓은 집합. 하나의 디렉토리에 여러 모듈 파일들을 가져다 놓은 것.


<사용예시> - 여행패키지 모듈들을 모아놓은 'travel' 패키지 


 






* 필리핀 패키지

class philippine_package:
def detail(self):
print("필리핀 패키지 3박4일 50만원")


* 베트남 패키지

class vietnam_package:
def detail(self):
print("베트남 2박3일 패키지 40만원")




* travel 폴더 안에 두개의 패키지가 들어있다. 













* 패키지 사용하기 - 파이썬 파일이 패키지와 같은 위치에 있어야 한다. 

1)

import travel.Philippine
trip_to = travel. Philippine.philippine_package()
trip_to.detail()

- import 를 통해 'travel' 패키지의 'Philippine' 패키지를 불러온다. 

- import 뒤에는 패키지나 모듈만 가능하고 클래스나 함수는 불가능 하다. 

- 'trip_to' 라는 변수를 생성하고 'Philippine' 패키지 안의 'philippine_package'  클래스 객체를 생성한다. 

- 'trip_to' 객체의 'detail()' 함수를 실행시킨다.

<실행결과>

필리핀 패키지 3박4일 50만원


2)

from travel.Philippine import philippine_package
trip_to = philippine_package()
trip_to.detail()

- from / import 를 통해서 'travel' 패키지 안의 'Philippine' 모듈의 'philippine_package' 클래스를 불러온다. 

- from / import 뒤에는 클래스나 함수가 올 수 있다. 

- 마찬가지로 'trip_to' 변수를 선언해서 'philippine_package' 클래스 객체를 생성한다. 1)과는 다르게 'philippine_package' 클래스를 바로 가져왔기 때문에 앞에 패키지나 모듈을 작성하지 않고 바로 사용이 가능하다.

- 'trip_to' 객체의 'detail()' 함수를 실행시킨다.

<실행결과> 

필리핀 패키지 3박4일 50만원


3)

from travel import Vietnam
trip_to = Vietnam.vietnam_package()
trip_to.detail()

- from / import 를 통해서 'travel' 패키지의 'Vietnam' 모듈을 불러온다.

- 동일하게 'trip_to' 변수를 선언해서 'Vietnam' 모듈의 'Vietnam_package' 클래스 객체를 생성한다.

- 'trip_to' 객체의 'detail()' 함수를 실행시킨다.

<실행결과>

베트남 2박3일 패키지 40만원




10-3. __all__


'random' 이나 'math' 모듈등을 불러올 때는 'from random import *' 형식으로 불러왔었는데 여기서  ' *'은 해당 모듈의 전부를 불러온다는 뜻이었다.

from travel import *
trip_to = Vietnam.vietnam_package()
trip_to.detail()

<실행결과>




그러나 사용자가 만든 패키지를 만들 때 '*'을 사용하면 에러가 발생한다. 패키지를 만들때 사용자가 공개범위를 설정해 줄 수 있기 때문이다. 


* 공개범위 설정하기


'__init__.py ' 파일을 'travel' 폴더 안에 만든다. '__init__.py' 파일 안에서 공개범위를 설정해 줄 수 있다. 






__all__ = ['Vietnam']

 '__all__' 에 공개해줄 범위를 정해주면 '*'을 사용했을 때 지정해준 범위내에서 작동하게 된다. 

이렇게 '__init__.py' 파일을 만들어 주고 위의 코드를 다시 실행하면 정상적으로 동작을 한다.

<실행결과>

베트남 2박3일 패키지 40만원


이때 범위로 지정해준 'Vietnam' 이 아닌 'Philippine' 모듈을 불러오면 에러가 발생한다. 




10-4. 모듈 직접 실행


모듈이 복잡한 경우 모듈이 잘 작동하는지 직접 실행해서 확인해 봐야 한다. 이때 모듈이 직접 실행되었는지, 외부에서 실행되었는지 구분할 수 있다. 


* __name__ : 이미 선언되어있는 변수로 모듈의 이름이 자동으로 저장된다. 단 모듈이 직접 실행되면 '__main__' 이 저장되고 모듈이 외부에서 실행되면 모듈의 이름이 저장된다. 


- 예시 

test.py

if __name__ == "__main__":
    print("in")
else :
    print("out")

<실행결과>

in


main.py

import test

print(__name__)
print(test.__name__)

<실행결과>

out

__main__

test



이를 활용해서 모듈이 직접 실행되었는지, 외부에서 실행되었는지를 구별할  수 있다. 


먼저 'Vietnam' 모듈에 다음의 코드를 추가해준다. 

class vietnam_package:
def detail(self):
print("베트남 2박3일 패키지 40만원")

if __name__ == '__main__':
print("모듈이 직접 실행됨")
trip_to = vietnam_package()
trip_to.detail()
else :
print("모듈이 외부에서 실행됨")

<실행결과>

모듈이 직접 실행됨

베트남 2박3일 패키지 40만원


'Vietnam' 모듈을 외부에서 불러와서 실행하면 else 부분이 실행된다. 

<실행결과>

모듈이 외부에서 실행됨

베트남 2박3일 패키지 40만원




10-5. 패키지 모듈 위치


* inspect 모듈 : 패키지나 모듈의 위치를 알려준다. 


import 로 'inspect' 모듈을 불러오고 'inspect' 모듈의 '.getfile()' 함수를 사용하면 모듈이나 패키지의 위치를 알 수 있다. 

import travel
from travel import Vietnam
import random
import inspect

print(inspect.getfile(travel))
print(inspect.getfile(Vietnam))
print(inspect.getfile(random))

<실행결과>

/Users/Desktop/python_project/travel/__init__.py

/Users/Desktop/python_project/travel/Vietnam.py

/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/random.py




10-6. pip install


pip 로 이미 만들어진 패키지를 설치하여 사용할 수 있다. 

파이썬을 활용하면서 이미 만들어진 패키지를 잘 활용하는 것도 매우 중요하다. 


맥북에서 안되는 경우 'pip3' 이라고 입력하면 된다. 


https://pypi.org : 이미 만들어진 패키지들을 볼 수 있다. 


사용하려고 하는 패키지를 복사해서 파이썬 실행창에 붙여넣고 엔터를 누르면 설치된다. 


pip list : 설치된 패키지들을 볼 수 있다. 

pip show (패키지 이름) : 해당 패키지의 정보를 보여준다.

pip install __upgrade (패키지 이름) : 해당 패키지를 업그레이드 시켜준다.

pip uninstall (패키지 이름) : 해당 패키지를 삭제시킨다. 



댓글

이 블로그의 인기 게시물

Spring Boot 6. 계시판 프로젝트

Spring Boot 2. Maria 데이터베이스 & Spring Data JPA

Django 10. DB 연동