파이썬 패키지와 모듈 알아보기

승톨·2020년 8월 30일
0
post-thumbnail

배경

파이썬으로 웹 어플리케이션을 만들다보니 다른 사람이 만든 패키지와 모듈을 사용할 때가 종종 있었고, 내가 만든 코드도 하나의 파일에만 작성하다보니 내용이 너무 길어져 코드를 분리하기 위해 패키지화와 모듈화를 진행했던적이 있다.
패키지와 모듈 개념 또한 정리해놓으면 좋을 것 같아 오늘은 패키지와 모듈에 대해 적어보고자 한다.

먼저 모듈부터 살펴보자.

모듈이란?

  • 파이썬에서의 모듈은 특정 요소(각종 변수, 함수, 클래스 등)를 .py 파일 단위로 작성한 것이다.
  • 프로그램의 꾸러미라고 생각하면 된다고 한다.
  • 모듈을 불러오면 모듈 내의 요소도 사용할 수 있다.
  • 예를 들어 os,math, string,re 라는 모듈 등이 있다.

예시 : math 모듈에서 제공하는 다양한 함수들.

모듈을 쓰는 방법

  • 모듈을 쓰기 위해서는 import를 사용하면 된다.
  • import에 모듈 이름을 지정하면 해당 모듈을 가져올 수 있다.

import의 의미 : 다른 프로그램으로부터 데이터를 갖고 오는 것.

  • 단, import는 현재 디렉터리에 있는 파일이나 파이썬 라이브러리에 저장된 디렉터리에 있는 파일만 불러올 수 있다.

형식

import 모듈
import 모듈1, 모듈2, 모듈3

모듈 내 요소 사용

모듈.변수
모듈.함수()
모듈.클래스()

예시

모듈 math를 사용

import math
math.pi
-> 3.141592653589793

math.sqrt(4.0)
-> 2.0

모듈 이름 지정

  • 모듈의 함수를 사용할 때 import as를 사용하여 모듈의 이름을 직접 지정할 수도 있다.

문법

import 모듈 as 이름

예시
math 모듈의 이름을 m으로 지정.

import math as m 
m.sqrt(4.0)2.0

참고 : 에러
모듈을 잘못 설정하면 아래와 같은 대표적인 에러를 만날 수 있다.

ModuleNotFoundError: No module named ... : 모듈의 이름이 잘못되었을 때 발생하는 에러이다.

AttributeError: module ... has no attribute ... : 모듈의 변수나 함수의 이름을 잘못되었을 때 발생하는 에러이다.

from import

  • 매번 모듈을 사용하려면 모듈.변수 같은 식으로 사용해야하는게 귀찮을 수 있다.
    그럴 때는 from import를 사용하면 모듈명을 없애고 요소명만 사용해서 간단하게 모듈을 사용할 수 있다.

문법

from 파일명(라이브러리) import 요소이름

예시 : 변수 가지고 오기

# math 모듈에서 변수 pi만 가져오기
from math import pi 
pi 
-> 3.141592653589793

# math 모듈에서 sqrt 함수만 가져오기
from math import sqrt 
sqrt(4.0) 
2.0

예시 :여러개의 변수,함수 등 한꺼번에 가지고 오기

# math 모듈에서 pi 변수, sqrt 함수 둘다 가져오기
from math import pi, sqrt 
pi 
-> 3.141592653589793

sqrt(4.0) 
-> 2.0

# 가져오고 싶은 요소가 엄청 많다면 모듈의 모든 요소 가져오기
from math import * # math 모듈의 모든 변수, 함수, 클래스를 가져옴
pi
-> 3.141592653589793

sqrt(4.0) 
-> 2.0

모듈의 일부를 가져온 뒤 내 맘대로 이름 지정하기

  • 모듈을 가져오더라도 이름이 너무 길거나 복잡하면 간편하게 줄이거나 내가 쓰고싶은 이름으로 개명(?)해서 사용할 수도 있다.

문법

from 모듈 import 변수 as 이름
from 모듈 import 함수 as 이름
from 모듈 import 클래스 as 이름
from 모듈 import 변수 as 이름1, 함수 as 이름2, 클래스 as 이름3

예시

#math 모듈에서 sqrt 함수를 가져오면서 이름을 s로 지정.
from math import sqrt as s 
s(4.0) 
-> 2.0

# math 모듈의 pi를 가져오면서 이름을 p로, sqrt를 가져오면서 이름을 s로 지정.
from math import pi as p, sqrt as s
p # p로 원주율 출력
-> 3.141592653589793

s(4.0) # s로 sqrt 함수 사용
-> 2.0

모듈을 해제하거나 다시 가져오기

  • import로 가져온 모듈은 del로 해제할 수 있다.

del math

  • 모듈을 다시 가져오려면 importlib.reload를 사용하면 된다.

import importlib
importlib.reload(math)

모듈 만들기

  • 우리가 모듈을 직접 만들 수도 있다. 그렇게 어렵지 않다.

예시 :
1.square2.py라는 파일을 생성.
2.해당 파일에서 square()라는 함수를 제작.
3.그 뒤에 다른 파일에서 square라는 함수를 사용하기 위해 우선 main.py라는 파일 생성.
4.main.py에서 square()라는 함수를 사용하기 위해square2 모듈을 불러오기

import square2               # import로 square2 모듈을 가져옴.

print(square2.square(10))    # 모듈.함수() 형식으로 square 함수 사용
  • 이 때 square2.py 파일과 main.py 파일은 반드시 같은 폴더에 있어야 한다.
  • 만약 다른 폴더에 있다면 패키지를 불러올 때의 문법을 사용해야한다.

패키지 알아보기

  • 패키지는 특정 기능과 관련된 여러 모듈을 묶은 것이다.

  • 패키지는 모듈에 네임스페이스(namespace, 이름공간)를 제공한다.

    네임스페이스에 관해서는 따로 개념을 자세히 공부하고 정리해보려고 한다!

  • 패키지는 특정 기능과 관련된 여러 모듈을 묶은 것이기 때문에 패키지도 import를 사용하여 가져온다.

패키지 만들기

우선 패키지를 만드는 것부터 알아보자.
패키지를 만드려면 일단 폴더를 만들어야 한다.

  1. calcpkg라는 폴더를 만들기
  2. 그 안에 init.py 파일을 생성.
  • 참고로 init.py 파일의 내용을 비워 둘 수 있다.
  1. 특정 폴더(디렉터리) 안에 init.py 파일이 있으면 해당 폴더는 패키지로 인식한다.
  2. 파이썬 3.3 이상부터는 init.py 파일이 없어도 패키지로 인식된다. 하지만 하위 버전에도 호환되도록 init.py 파일을 작성하는 것을 권장.

이제 패키지를 사용할 수 있게 되었다!
패키지 사용 문법은 모듈을 쓰는 문법에서 상위 계층만 추가된다고 생각하면 쉽다.

문법

import 패키지.모듈
import 패키지.모듈1, 패키지.모듈2

사용

패키지.모듈.변수
패키지.모듈.함수()
패키지.모듈.클래스()

패키지 안에 속한 모듈의 요소 편하게 사용하기

패키지 안에서도 다른 모듈의 변수나 함수를 사용해야 할 케이스가 있는데, 매번 모듈 이름을 붙이면서 사용하면 귀찮을테니 아래와 같은 방법을 사용하면 편하다.

예시 : calcpkg 패키지에 속한 모든 변수, 함수, 클래스를 가져오기

0.calcpkg 라는 패키지 제작. 해당 패키지에는 operation, geometry라는 모듈이 존재.
1.calcpkg 패키지를 사용하기 위해 패키지 밖에 main.py 파일 생성 
2.파일에 from calcpkg import * 작성
3. calcpkg.operation에는 add 함수, mul 함수가 존재.
4.calcpkg.geometry에는 triangle_area 함수, rectangle_area 가 존재.

from calcpkg import * 
print(add(10, 20)) # operation모듈의 add 함수 사용
print(mul(10, 20)) # operation모듈의 mul 함수 사용
print(triangle_area(30, 40)) # geometry모듈의 triangle_area 함수 사용
print(rectangle_area(30, 40)) # geometry모듈의 rectangle_area 함수 사용

이러면 될 것 같지만, 다음과 같은 에러가 뜬다.

Traceback (most recent call last):
  File "~~\~~~\main.py", line 3, in <module>
    print(add(10, 20))    # operation 모듈의 add 함수 사용
NameError: name 'add' is not defined 

해당 에러는 add가 정의되지 않았다는 뜻이다.

  • 즉, main.py를 실행 할 때 calcpkg 패키지의 __init__.py에서 모듈만 가져왔을 뿐 모듈 안의 함수는 가져오지 않았기 때문이다.
  • 패키지의 네임스페이스를 확인해보면 operationgeometry만 들어있어서 addmul처럼 함수는 이름만으로는 호출할 수가 없다.
  • 패키지/모듈 안의 함수나 변수를 사용하려면 해당 요소가 네임스페이스 안에 속해있어야 한다.
  • 따라서 __init__.py에서 모듈 안의 함수를 가져오게 만들어야 한다.
  • 패키지(calcpkg)라는 것을 명확하게 나타내기 위해 모듈 앞에 .(점)을 붙인다.

문법
from .모듈 import 변수, 함수, 클래스

예시

calcpkg/__init__.py

from .operation import add, mul
from .geometry import triangle_area, rectangle_area

마치며

오늘은 패키지와 모듈의 사용법에 대해 알아보았다.
앞으로도 많이 쓸 개념이다보니 한번 정리를 하고나니까 좀더 명확해진 느낌이 든다.

이번 글 작성에는 아래의 링크를 참고했습니다.
https://dojang.io/mod/page/view.php?id=2441

profile
소프트웨어 엔지니어링을 연마하고자 합니다.

0개의 댓글