본문 바로가기

전공

파이썬_모듈, 패키지

모듈의 개념

모듈

 - 파이썬의 함수, 클래스 등의 정의와 변수와 실행문 등을 저장한 파일

 - 모듈 이름 = 파일명 (모듈은 파일 단위)

 - 자주 사용하는 코드들을 묶어 따로 파일로 저장해 사용

 

패키지

 - 특정 기능관 연관된 모듈의 모음

 - __init__.py 파일을 갖고 있고, python3.3 버전부터 없어도 인식되지만 하위 버전과의 호환을 위해 생성하는 것이 안전함

 

라이브러리

 - 특정 기능과 연관된 패키지의 모음

 - 파이썬에서는 패키지와 라이브러리가 개념적으로 차이 없이 쓰임

 

프레임워크

 - 애플리케이션의 기능을 수행하기 위해 설계한 데이터 흐름과 구조를 갖는 모듈과 패키지의 모음

 ex. Django, Flask, FastAPI 등

 

모듈의 유형

실행문만 있는 모듈

 - 일반적으로 메인 모듈로 사용하기 위해 만든 모듈

# hello.py
print("hello 모듈입니다")
print("Hello World")

# insa.py
import hello

# insa.py 파일 실행 결과
# hello 모듈입니다
# Hello World

 

함수, 클래스 정의만 있는 모듈

 - 함수나 클래스 등의 정의만 있는 모듈 파일

# hello_func.py
def hello():
    print("hello_func 모듈")
    print("__name__ : ", __name__)	# __name__ : hello_func 출력됨 
    
    
# insa_func.py
import hello_func
# main 함수
def main():
    print("insa 모듈")
    print("__name__ : ", __name__) # __name__ : __main__ 출력됨
    hello_func.hello()
    
# main 실행
main()

# 실행 결과
# insa 모듈
# __name__ : __main__
# hello_func 모듈
# __name__ : hello_func

 

실행문과 함수, 클래스 정의가 같이 있는 모듈

 - 실행문과 함수, 클래스 정의가 같이 있는 모듈 파일

# gugudan.py
def gugudan(n):
    print("{}단을 출력합니다".format(n))
    for i in range(1, 10):
        print(n, "x", i, "=", n*i)

if __name__ = "__main__":
    gugudan(3)
   

# gugudan_main.py
import gugudan

def main():
    for i in range(2, 10):
        print("=" * 20)
        gugudan.gugudan(i)
        
if __name__ = "__main__":
    main()

# 메인 모듈로 실행될 경우 __name__ 내장 변수가 __main__으로 설정됨

gugudan.py의 gugudan(3)처럼 모듈로 실행되지 않고 임포트되어 실행될 때 실행되면 안 되는 코드가 있으면 __name__ 변수 값을 이용하여 처리하도록 작성

 

모듈 정의하기

모듈 만들고 이름 붙이기

 - 파이썬 코드를 파일로 저장하면 모듈이 되는데, 모듈의 이름은 파일명을 따라간다

 

모듈명

 - 대소문자 모두 사용해 모듈명 정의할 수 있지만 가급적 짧은 소문자로 된 이름을 사용

ex. hello, main, greeting, user, hello_world, user_input 등

 # 피해야 하는 이름 : Hello, Main, Greeting, User, HelloWorld, UserInput 등

 

실행문만 있는 모듈

 - 코드 그대로 가져와 쓰는 경우를 제외하고는 재활용하기 곤란하다

 

함수가 있는 모듈

 - 실행문을 재사용 할 수 있도록 함수로 만들어 정의하고, 메인 모듈로 실행할 때만 실행문이 실행되도록 작성

 

스크립트로 실행한 모듈에서 인자 값 얻기

 - 모듈을 스크립트로 실행할 때 옵션을 인자 값으로 받아와 사용 가능

 - argv 변수에 넘겨진 인자 값 저장

 - sys 모듈을 임포트해서 argv 리스트 변수를 참조하여 사용 (argv 리스트의 첫 번째 항목은 실행한 파일명)

// area.py
import sys

def tri_area(width, height):
    return width * height * 1/2

def box_area(width, height):
    reutnr width * height
    
def print_area(width, height):
    print("가로", width, "세로", height, "인 삼각형의 넓이 :", tri_area(width, height))
    print("가로", width, "세로", height, "인 사각형의 넓이 :", box_area(width, height))
    
if __name__ = "__main__":
    if len(sys.argv) == 3:
        print_area(int(sys.argv[1]), int(sys.argv[2]))
    else:
        print("사용법 : python area.py 가로 세로")

 

모듈 사용하기

모듈 임포트하기

 - import 문을 사용하여 모듈을 불러온 뒤, 모듈 이름 뒤에 '.'을 붙이고 모듈 안의 함수나 클래스를 참조해서 사용

# main_exit.py
import sys

while True:
    print("종료하려면 exit를 입력하세요")
    user_input = input(">> ")
    if user_input == "exit":
        sys.exit()	# 프로그램 종료

 

모듈의 특정 함수나 클래스만 임포트하기

 - from 모듈이름 import 함수명

 - 위 방식으로 임포트할 경우 모듈명을 통하지 않고 함수 호출 가능

# main_exit2.py
from sys import exit

while True:
    print("종료하려면 exit를 입력하세요")
    user_input = input(">> ")
    if user_input == "exit":
        exit()	# 모듈명을 통하지 않고 함수 호출

 

모듈의 모든 함수, 클래스 임포트하기

 - 모듈의 특정 함수, 클래스를 임포트하는 from import 문으로 모든 함수 임포트 가능

 - 모듈 대부분을 사용하는 경우가 아니라면 필요한 모듈만 임포트하여 사용하는 것이 유지 보수 측면에서 더 나을 수 있다

 

from import 문으로 모듈 전체 임포트

 - 호출할 때 모듈 이름을 매번 사용하지 않아도 사용 가능

 - 모듈 간의 함수가 겹치는 등의 문제가 발생할 수 있음

# main_exit3.py
from sys import *

while True:
    print("종료하려면 exit를 입력하세요")
    user_input = input(">> ")
    if user_input == "exit":
        exit()	# 모듈명을 통하지 않고 함수 호출

 

모듈 이름을 바꿔서 임포트하기

 - 모듈 이름을 더 쉽게 바꾸거나, 사용하는 다른 변수와 이름이 겹칠 경우 등 import as 문으로 이름 변경해서 사용 가능

 - 모듈 이름을 변경한 경우 원래 모듈 이름으로는 접근 불가

# main_exit4.py
import sys as s

sys = "반복 시스템"

while True:
    print(sys)
    print("종료하려면 exit를 입력하세요")
    user_input = input(">> ")
    if user_input == "exit":
        s.exit()	# 변경된 모듈 이름을 통해 접근 가능

 

모듈 검색 경로

 - 모듈을 임포트할 때 제일 먼저 호출하는 코드의 모듈과 같은 디렉터리에서 해당 모듈 탐색

 - 만약 같은 디렉토리에 없다면 파이썬 탐색 경로를 순서대로 돌아가며 탐색

 - 모듈 탐색 경로 : 운영 체제의 환경 변수(윈도우 = %PYTHONPATH%, 리눅스/유닉스/맥 = $PYTHONPATH 환경 변수 값)

import sys
print(sys.path)
# 리스트 형태로 파이썬 탐색 경로 출력

# 만약 모든 경로에서 모듈을 찾을 수 없을 때는 ImportError 예외 발생

 

패키지 정의하기

패키지

 - 모듈을 구조화하고 효율적으로 관리하기 위해 나눠 놓은 것 (모듈을 용도 또는 유형별로 디렉터리를 생성해 분류한 것)

 - 파일 생성 시 해당 모듈에 접근해 사용할 수 있지만, 하위 호환성을 위해 __init__.py 파일 생성하는 것이 좋음

# 패키지 예시
main_drinks.py
main_fruits.py
foods/
     __init__.py
     drinks/
          __init.py
          milk.py
          water.py
     fruits/
          __init.py
          orange.py
          watermelon.py
          apple.py
          
# foods/drinks/milk.py
def drink():
    print("milk")
    
# main_drinks.py
from foods.drinks import milk	# 패키지 임포트
milk.drink()

 

__all__변수

 - 패키지 디렉터리의 __init__.py 파일 안에 __all__변수 정의 가능

 - 해당 디렉터리 안에 있는 모듈의 이름들을 넣는 리스트 변수

 - from import * 문을 사용하여 모듈을 불러올 때 특정 모듈만 가져오거나 특정 모듈을 빼고 싶을 때 사용

 -> from import * 문을 사용했을 때 알려줄 모듈 목록을 __all__변수에 저장

# foods/fruits/__init__.py
__all__ = ['orange', 'watermelon']	# 임포트 시 orange.py와 watermelon.py 파일만 인식

# main_fruits.py
from foods.fruits import *

orange.eat()	# 문제 없이 호출
apple.eat()	# apple 모듈을 못 찾아서 에러 발생

 

패키지 사용하기

패키지가 있는 특정 모듈 임포트하기

 - from 부분에 패키지, imoprt 부분에 임포트할 모듈 작성

 - 모듈 이름을 통해서 함수 호출

 - as 키워드를 사용해 모듈 이름 변경

 - import 문만 사용해 패키지 있는 모듈 임포트 가능하지만, 호출할 때마다 패키지명까지 같이 써야 함

# 패키지가 있는 특정 모듈 임포트
from foods.drinks import milk
milk.drink()

# 패키지가 있는 특정 모듈의 이름 변경해 임포트
from foods.drinks import milk as m
m.drink()

# 패키지가 있는 모듈의 특정 함수/클래스 임포트
from foods.drinks.milk import drink
drink()

# 패키지가 있는 모듈의 모든 함수/클래스 임포트
from foods.drinks.milk import *
drink()

# import문만 사용해서 패키지가 있는 모듈 임포트
import foods.drinks.milk
foods.drinks.milk.drink()

 

표준 라이브러리 활용하기

표준 라이브러리

 - 파이썬에서는 내장 상수, 내장 함수, 모듈 등을 다양하게 제공한다

 - https://docs.python.org/ko/3/library/

 

os 모듈

 - 운영 체제에 작업을 요청하는 기능을 제공

 ex. 파일 읽고 쓰기, 디렉터리 생성과 삭제, 현재 작업 디렉터리 찾기, 현재 시각 확인 등

 - os모듈 API문서

import os

print("현재 작업 디렉터리는", os.getcwd(), "입니다")	
# get working directory 명령, 현재 작업 디렉터리 위치 출력
os.system('dir') 
# system 함수를 사용해 명령 프롬프트나 셀에서 동작할 명령어를 운영체제에 요청
# dir : 운영체제가 파일, 디렉터리 목록을 보여주는 명령어

 

sys 모듈

 - 파이썬 인터프리터에서 사용하는 변수나 기능에 접근할 때 사용

 - sys모듈 API문서

import sys

print('실행 파일명 :', sys.argv[0])	# argv 첫 번째 값 = 실행한 파이썬 파일명

# 옵션 출력
for i in range(1, len(sys.argv)):
    print('옵션', i, ':', sys.argv[i])

sys.exit()	# 프로그램 종료

for _ in range(1, 100):
    print("실행되지 않음")

 

math 모듈

 - 수학 계산에 유용한 상수와 함수를 제공

 ex. 상수, 올림, 내림, 계승, 최대공약수, 거듭제곱, 삼각함수, pi, e 등

 - math모듈 API문서

import math

print('파이 상수')
print('math.pi :', math.pi)	# 3.141592653589793

print('e 상수')
print('math.e :', math.e)	# 2.718281828459045

print('올림')
print('math.ceil(3.5) :', math.ceil(3.5))	# 4

print('내림')
print('math.floor(3.5) :', math.floor(3.5))	# 3

print('계승 구하기')
print('math.factorial(5) :', math.factorial(5))	# 120

print('최대공약수 구하기')
print('math.gcd(28, 70) :', math.gcd(28, 70)	# 14

print('거듭제곱 구하기')
print('math.pow(2, 10) :', math.pow(2, 10))	# 1024.0

print('삼각함수 sin(1/2π)')
print('math.sin(math.pi/2) :', math.sin(math.pi/2))	# 1.0

print('삼각함수 cos(π)')
print('math.cos(math.pi) :', math.cos(math.pi))	# -1.0

print('삼각함수 tan(0)')
print('math.tan(0) :', math.tan(0))	# 0.0

 

random 모듈

 - 특정 범위에서 임의의 난수 값을 생성하거나 주어진 몰곡에서 하나를 고르는 함수를 제공

 - random모듈 API문서

import random as r

# 0 이상 1 미만 실수 값 : random()
print('r.random() : ', r.random())

# 실수값 : uniform()
print('시작값 2.5이상 끝값 10.0 미만 실수 값')
print('r.uniform(2.5, 10.0) :', r.uniform(2.5, 10.0)

# 랜덤 정수값 : randrange()
print('0 이상 끝값 10 미만 정수 값')
print('r.randrange(10) :', r.randrange(10))

print('1 이상 끝값 7 미만, 증가 값이 2인 정수 값')
print('r.randrange(1, 7, 2) :', r.randrange(1, 7, 2))

# 리스트에서 1개 값 꺼내오기 : choice()
season = ['봄', '여름', '가을', '겨울']
print('r.choice(season) :', r.choice(season))

# 리스트 순서 섞기 : shuffle()
li = ['가', '나', '다', '라', '마']
r.shuffle(li)
print(li)

# 리스트에서 몇 개의 값을 중복하지 않고 뽑기 : sample()
li = ['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번', '9번']
print('r.sample(li, 3) :', r.sample(li, 3))	# 리스트 출력됨

 

datetime 모듈

 - 날짜와 시간을 다루는 데 사용

 ex. 현재의 연, 월, 일, 시, 분, 초, 요일 등을 구하기, 날짜 간의 계산

 - datetime모듈 API문서

from datetime import datetime	# datetime모듈의 datetime 클래스 임포트

# 현재 날짜 시각 객체
today = datetime.now()

print('today = datetime.now() :', today)	# 2024-12-19 02:10:47.461814
print('연, 월, 일 :', today.year, today.month, today.day)
print('시, 분, 초 :', today.hour, today.minute, today.second)
print('요일 :', today.weekday())

# 특정 날짜 시각 객체 만들기
day = datetime(2024, 1, 1, 0, 0, 0)
print('day = datetime(2024, 1, 1, 0, 0, 0) :', day)	# 2024-01-01 00:00:00

# 2024년부터 지나온 시간 구하기
print('today - day :', today - day) # 353 days, 2:10:47.461814

 

써드파티 패키지 활용하기

써드파티 패키지

 - 파이썬 표준 라이브러리 외의 제 3자가 개발한 모듈

 

PYPI

 - 써드파티 패키지 중 하나로 PYPI(Python Package Index)에 의해 공유되는 패키지

 - PIP(Pip Installs Packages) 도구를 사용하여 간편하기 설치 가능

 - pip install 프로젝트명

 

유용한 써드파티 패키지

프로젝트명 설치명 설명
Beautiful Soup pip install bs4 XML, HTML 문서를 효과적으로 처리하여 필요한 정보를 추출해서 활용할 수 있도록 도와주는 라이브러리
Pillow pip install pillow 이미지 처리르 도와주는 라이브러리
PeeWee pip install peewee SQLite, MySQL, PostgreSQL을 지원하는 쉽게 사용할 수 있는 경량 ORM
Scrapy pip install scrapy 스크래핑 및 웹크롤링을 위한 라이브러리로 데이터를 추출하여 결과를 json, xml, csv 같은 형식으로 내보내주는 라이브러리
Pygame pip install pygame 게임 제작을 위한 프레임워크
Pathlib pip install pathlib 운영 체제 간 파일 경로 문제 해결
Numpy pip install numpy 수학 통계 처리 라이브러리
Django pip install django 대표적인 파이썬 웹 개발 프레임워크
Flask pip install flask 대표적인 파이썬 웹 개발 프레임워크