Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

뒤죽박죽 데이터분석 일기장

[Python] [5일차] 모듈과 패키지 본문

Python

[Python] [5일차] 모듈과 패키지

시우마이 2023. 1. 7. 17:55

안녕하세요. Dayconic 입니다. 이번 포스트는 파이썬에서 다양한 기능들을 사용하기 위한 필수 단계인 모듈과 패캐지 개념에 대해서 알아보려고 합니다. 

 

 모듈이란?

: 변수, 함수, 클래스를 하나의 파일(.py)로 모아서 코드를 작성한 것 

 

패키지이란?

: 여러개의 모듈 파일을 디렉토리로 구분하여 코드를 작성하는 방법 

 

 

모듈을 만들어 보겠습니다. 

 

%%writefile ai_school.py
data = 'python'

def echo(msg) :
    print('ai school : ', msg)

 

위의 모듈을 생성하고 나서 

 

import ai_school 
# import 모듈명 ;을 입력해 모듈을 불러올 수 있습니다.

 

아래의 코드는 colab의 지원하는 기능이고 파일을 생성할 수 있게 기능을 가지고 있습니다.

 

 

%%%writefile ai_school.py
# %%%writefile 파일명.py

 

생성된 모듈에는 변수와 함수를 하나씩 포함하고 있습니다. 

 

이렇게 생성된 모듈은 colab에서 지원하는 기능을 통해 더 자세히 확인할 수 있습니다. 

 

%ls <- 설치여부 확인

# 결과
# ai_school.py  sample_data/

%whos <- 설치 위치 및 데이터 타입 확인

# 결과 
# Variable    Type      Data/Info
# -------------------------------
# ai_school   module    <module 'ai_school' from '/content/ai_school.py'>

%cat <- 모듈의 내용을 확인하고 싶을때 

# 결과
# data = 'python'
# def echo(msg) :
#    print('ai school : ', msg)

 

특히 %cat을 통해 모듈이 포함하고 있는 변수나 함수에 대해서 더 자세히 확인할 수 있습니다. 

 

 

모듈 변수 출력

# 모듈 변수 출력 
ai_school.data

# 결과
# 'python'

 

모듈 함수 출력 

# 함수 실행
ai_school.echo("너무 어렵지만 화이팅입니다!") 

# 결과
# ai school :  너무 어렵지만 화이팅입니다!

 

모듈 이름 간소화 : 모듈이름이 너무 길때는 as를 사용해 줄일 수 있습니다! 

import ai_school as ais 
print(ais.data)
ais.echo('fighting!~') 

# 결과
# python
# ai school :  fighting!~

 

추후에 판다스나 넘파이를 사용할 때도 간소화 후 사용해 진행합니다. 

 

# 예시 
import numpy as np
import pandas as pd

 

패키지 : 패키지는 여러개의 모듈을 디렉토리에 구분해서 코드를 작성합니다. 

 

코랩 서버 컴퓨터는 리눅스 ubuntu os 기반으로 서비스를 제공하기 때문에 tree 라는 디렉토리의 구조를 출력하는 리눅스 ubuntu(os) 패키지를 이용해 디렉토리를 확인할 수 있습니다. 

 

그럼 tree package를 설치해 보겠습니다. 

 

일반적인 패키지를 설치할 때는 아래의 코드를 사용합니다. 

 

pip install package_name

 

하지만, 코랩 서버는 리눅수 우분투(os)를 사용하기 때문에 다른 방법으로 설치해 줘야 합니다. 

 

!apt-get install tree -y
# 위와 같은 shell command는 주석이 위에 있으면 안됨

 

그러고 아래의 방법으로 디렉토리를 구성할 수 있습니다. 

 

# 패키지 구조 만들기 
# 아래는 우분투에서 작동되는 명령어 
# mkdir : 디렉토리 만들기 
# -p : 상위 디렉토리를 만들면서 디렉토리 만들기 
# touch : 빈파일 생성

!mkdir -p stock/kor 
!mkdir -p stock/usa 
!touch stock/__init__.py
!touch stock/kor/__init__.py 
!touch stock/usa/__init__.py 

!tree stock

결과:

 

특정 디렉토리에 모듈 생성하기 

 

위의 방법을 사용해 코스닥, 코스피 모듈은 kor 폴더에 그리고 나스닥과 snp500 모듈은 usa 폴더에 넣어보겠습니다. 

 

%%writefile stock/kor/kosdaq.py
def crawl_kosdaq():
    print('crawl_kosdaq')
%%writefile stock/usa/snp500.py
def crawl_snp500():
    print('crawl_snp500')
%%writefile stock/usa/nasdaq.py
def crawl_nasdaq():
    print('crawl_nasdaq')
!tree stock

결과:

 

각각 kor 그리고 usa 폴더 밑에 생성한 __init__.py는 패키지에 있는 디렉토리의 모듈을 설정하는 파일입니다. 

 

파이썬 3.x 버젼부터는 쓰지 않아도 문제가 없지만 하위버젼 호환성을 위해 써주는 게 좋습니다. 

 


패키지 안에 코드 초기화

 

!rm -rf stock

 

 

자 이렇게 성공적으로 패키지를 만들었습니다. 각 디렉토리에 원하는 모듈들이 저장되어 있습니다. 

 

이 패키지를 이용해 저장되어 있는 모듈을 import 해 사용할 수 있습니다. 

 

# 코스피 모듈을 import 하려면 
import stock.kor.kospi # stock 패키지 안에 있는 kor 폴더에 kospi 모듈을 출력

 

코스피 모듈안에 있는 함수를 출력해 보겠습니다. 

 

import stock.kor.kospi

stock.kor.kospi.crawl_kospi()

# 결과
# crawl_kospi

 

패키지 안에 있는 모든 모듈 가져오기

from stock.kor import *

 

위의 방법은 패키지 안에 있는 모든 모듈을 불러오는 방법입니다. 

 

%%writefile stock/kor/__init__.py
__all__ = ['kospi'] # 모듈이름

이 방법을 하기 전에는 __all__ 을 써야지 성공적으로 불러올 수 있습니다. 

 

 

 

패키지 서치 방법

 

1. 기본으로 설치되어 있는 패키지 목록 불러오기 

 

!ls /usr/lib/python3.8
# default packages

 

2. 설치된 패키지 목록 불러오기 

 

!ls /usr/local/lib/python3.8/dist-packages
# installed packages

 

3. 특정 키워드 패키지 출력하기 

 

!pip list | grep pandas
# 여기서 입력된 특정 키워드는 pandas

 

알아두면 좋은 상식: 현재 구글 colab에서는 이미 설치된 패키지에 한해서는 삭제하는 기능을 지원하지 않습니다. 

 

 

파이썬 입문 문법의 마지막으로 예외처리를 공부해 보겠습니다. 

 

예외처리란? 코드의 에러를 처리하는 방법입니다. 

 

예외처리에서는 try, except, finally, raise가 사용됩니다. 

 

try:
    print(1/0)  
except Exception as e:   # 오류 내용은 e로 저장, 
    print(e)	# e 출력 
print('python')

# 결과 
# division by zero <- 에러 내용
# python

설명: try 구문 안에서 명령어를 실행합니다. except 을 이용해 오류내용을 e로 저장하고 출력합니다. 

 

이번에는 위의 코드에 finally를 넣어 사용해 보겠습니다. 

 

try:
    a = open('sales.pkl','w')
    print(a+b+c+d)
    #어떤 코드를 실행 
    
finally: 
	a.close() #중간에 무슨 오류가 발생하던 종료한다

 

finally의 경우 try 안에 명령문에서 어떤 오류가 있더라도 finally 안에 있는 명령어는 실행됩니다. 

 

 

에러 만들기

 

# 에러만들기 
class LowNumber(Exception): #exception class 상속
    def __str__(self):
        return 'insert number greater than 10!'

설명: 클래스 안에 exception class를 상속해 주고 오류 발생시 출력할 문자열을 입력해 줍니다. 

 

# 함수의 파라미터에 10이하의 데이터가 넘어오면 에러(LowNumber)를 발생
def input_number(number):
    if number <= 10:
        raise LowNumber 
    print(number)
    
input_number(2)

설명: 함수를 만들어서 함수 안의 조건문에 예를 들어 10보다 작은 수 일 때 LowNumber라는 에러 클래스를 출력한다는 걸 raise을 이용해 표현합니다. 

 

결과: 

 

위처럼 오류가 발생합니다. 그러고 오류 내용을 아까 우리가 설정했던 LowNumber class에 들어있는 문자열로 출력되는 걸 확인할 수 있습니다. 

 

 

 


 

지금까지 모듈, 패키지, 예외처리에 대해서 복습해 봤습니다. 혹시 틀린 부분이 있다면 댓글로 남겨주시면 감사하겠습니다. 지금까지 읽어주셔서 감사합니다.