파이썬으로 웹 어플리케이션을 만들다보니 다른 사람이 만든 패키지와 모듈을 사용할 때가 종종 있었고, 내가 만든 코드도 하나의 파일에만 작성하다보니 내용이 너무 길어져 코드를 분리하기 위해 패키지화와 모듈화를 진행했던적이 있다.
패키지와 모듈 개념 또한 정리해놓으면 좋을 것 같아 오늘은 패키지와 모듈에 대해 적어보고자 한다.
먼저 모듈부터 살펴보자.
.py
파일 단위로 작성한 것이다.예시 : math 모듈에서 제공하는 다양한 함수들.
import의 의미 : 다른 프로그램으로부터 데이터를 갖고 오는 것.
형식
import 모듈
import 모듈1, 모듈2, 모듈3
모듈.변수
모듈.함수()
모듈.클래스()
예시
모듈 math를 사용
import math
math.pi
-> 3.141592653589793
math.sqrt(4.0)
-> 2.0
모듈 이름 지정
문법
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 요소이름
예시 : 변수 가지고 오기
# 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
del math
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를 사용하여 가져온다.
우선 패키지를 만드는 것부터 알아보자.
패키지를 만드려면 일단 폴더를 만들어야 한다.
이제 패키지를 사용할 수 있게 되었다!
패키지 사용 문법은 모듈을 쓰는 문법에서 상위 계층만 추가된다고 생각하면 쉽다.
문법
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가 정의되지 않았다는 뜻이다.
calcpkg
패키지의 __init__.py
에서 모듈만 가져왔을 뿐 모듈 안의 함수는 가져오지 않았기 때문이다.operation
, geometry
만 들어있어서 add
, mul
처럼 함수는 이름만으로는 호출할 수가 없다. __init__.py
에서 모듈 안의 함수를 가져오게 만들어야 한다. 문법
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