본문 바로가기
Python

나도코딩 파이썬 11장 - 모듈과 패키지

by 햣둘 2023. 3. 31.

<11장 요약>

1. 모듈 : 서로 관련이 있거나 비슷한 기능을 하는 함수, 클래스 등을 담고 있는 파일

모듈화 : 개발하기 쉽도록 프로그램의 기능을 독립적인 작은 단위로 나누는 작업

 

2. 패키지 : 여러 모듈을 하나의 폴더 안에 담아 구성한 모듈들의 집합

폴더에 __init__.py 파일을 두면 패키지로 인식한다. 

 

3. 내장함수 : 파이썬에서 기본으로 제공해서 별도로 import하지 않고도 사용할 수 있는 함수

ex) input(), len(), range(), print()

 

4. 외장함수 : 파이썬을 설치할 때 함께 설치되지만 모듈을 import해야만 사용할 수 있는 함수

ex) random, glob, os, time, datetime

 

 

 

11.1 모듈 다루기

모듈 : 서로 관련이 있거나 비슷한 기능을 하는 함수, 클래스 등을 담고 있는 파일

모듈화 : 개발을 용이하게 하기 위해 프로그램의 기능을 독립적인 작은 단위로 나누는 작업

 

11.1.1 모듈 만들기

작업 폴더(PythonWorkspace폴더) 안에 theater_module.py라는 이름으로 파이썬 파일을 새로 만들자.

이 파일에 사람 수에 따른 영화표 가격을 계산하는 함수 3개를 정의한다.

Ctrl + S를 눌러 저장하면 이것으로 모듈 생성은 끝이다. 이제 다른 파일에서 가져다 사용할 수 있다.

#일반 가격
def price(people):
    print("{0}명, 영화표 가격은 {1}원입니다.".format(people, people*10000))

#조조 할인 가격
def price_morning(people):
    print("{0}명, 조조 할인 영화표 가격은 {1}원입니다.".format(people, people*6000))

#군인 할인 가격
def price_soldier(people):
    print("{0}명, 군인 할인 영화표 가격은 {1}원입니다.".format(people, people*4000))

 

11.1.2 모듈 사용하기

생성한 모듈을 새로운 파일(ch11.py)에서 사용해보자.

주의할 점은 theater_module.py파일과 ch11.py(모듈을 사용할 파일)은 서로 같은 폴더에 있어야 한다는 것이다.

모듈을 사용하는 방법은 여러 가지가 있는데, 가장 기본적인 import문을 먼저 보겠다.

import theater_module #모듈 가져오기

theater_module.price(3) #3명, 영화표 가격은 30000원입니다.
theater_module.price_morning(4) #4명, 조조 할인 영화표 가격은 24000원입니다.
theater_module.price_soldier(5) #5명, 군인 할인 영화표 가격은 20000원입니다.

 

as를 사용해서 모듈에 별명을 붙여 줄 수도 있다. theater_module을 줄여 mv라고 하겠다.

import문 뒤에 as mv를 추가하면 theater_module 이렇게 길게 부르지 않고 간단하게 mv로 호출할 수 있다.

import theater_module as mv

mv.price(3) 
mv.price_morning(4) 
mv.price_soldier(5)

 

이번에는 from ~ import 형식을 사용해보자. 

from 뒤에 모듈명을 적고 모듈에서 가져다 사용할 기능이나 함수를 import 뒤에 적어주면 된다.

from ~ import문으로 가져온 모듈은 모듈명과 점 부분을 적어줄 필요 없이 모듈의 함수명만 적으면 된다.

from theater_module import * #theater_module에서 모든 기능을 가져와 사용함

price(3) 
price_morning(4) 
price_soldier(5)

 

해당 모듈의 모든 기능이 필요하지 않을 때도 있다. 이럴 때는 from ~ import문 뒤에 * 대신 사용하려는 함수명만 적으면 된다. 가져올 함수가 여러 개일 때는 쉼표로 구분한다.

from theater_module import price, price_morning

price(3) 
price_morning(4)

 

from ~import 문에서도 as를 사용해 별명을 지어줄 수 있다. price_soldier함수만 가져온다고 했을 때 price라는 이름으로 새로 별명을 붙여 as price로 써주면 된다. price(3)를 해줄 때 실제 호출하는 함수는 theater_module모듈의 price()가 아니라 price_soldier()이다. 

from theater_module import price_soldier as price

price(3) #3명, 군인 할인 영화표 가격은 12000원입니다.

 

 

11.2 패키지 다루기

항공, 숙소, 차량 등을 한꺼번에 묶어놓은 패키지 여행처럼 여러 모듈을 모아 놓은 집합패키지라고 한다.

패키지는 보통 여러 모듈을 한 폴더 안에 담아 구성한다.

 

11.2.1 패키지 만들기

태국 패키지여행 상품을 위한 tailand.py파일의 내용을 채워보자. 

아래의 detail()메서드를 호출하면 태국 패키지여행 상품에 대한 요약 정보가 출력된다.

class ThailandPackage:
    def detail(self):
        print("[태국 3박 5일 패키지] 방콕, 파타야 여행(야시장 투어) 50만원")

 

비슷한 형태로 vietnam.py 파일에 베트남 패키지여행 클래스를 정의한다.

class VietnamPackage:
    def detail(self):
        print("[베트남 3박 5일 패키지] 다낭 효도 여행 60만원")

 

* __init__.py

__init__.py 이 파일은 해당 폴더가 패키지라는 것을 명시하기 위해 만든다. 폴더에 __init__.py 파일을 만들어 두면 해당 폴더를 패키지로 인식한다. 그런데 파이썬 3.3버전부터는 이 파일이 없어도 상관 없다. 다만, 호환성 문제를 위해 파일을 생성해두기를 권장한다.

 

 

11.2.2 패키지 사용하기

ch11.py에서 travel 패키지를 사용해보자. 패키지명(travel) 뒤에 점을 찍고 모듈명(thailand)을 적어 import문으로 가져오면 된다. 그리고 ThailandPackage 클래스로 trip_to라는 객체를 만들어 detail()메서드를 호출한다.

객체 = 패키지명.모듈명.클래스명() 

import travel.thailand
trip_to = travel.thailand.ThailandPackage()
trip_to.detail()

#[태국 3박 5일 패키지] 방콕, 파타야 여행(야시장 투어) 50만원

import문만 사용할 때는 대상이 모듈이나 패키지여야 하고, 클래스나 함수는 가져올 수 없다.

 

하지만 from ~ import문을 사용하면 함수부터 클래스, 모듈, 패키지까지 모두 import할 수 있다.

이렇게 하면 객체를 생성할 때 클래스명만으로 객체를 생성할 수 있다.

from travel.thailand import ThailandPackage
trip_to = ThailandPackage()
trip_to.detail()

#[태국 3박 5일 패키지] 방콕, 파타야 여행(야시장 투어) 50만원

 

이번에는 travel 패키지에서 vietnam모듈을 가져왔다. 이렇게 작성하면 패키지명 없이 모듈명만으로 모듈 안에 있는 VietnamPackage 클래스에 접근할 수 있다. 

from travel import vietnam
trip_to = vietnam.VietnamPackage()
trip_to.detail()

#[베트남 3박 5일 패키지] 다낭 효도 여행 60만원

패키지에서는 import대상이 무엇이냐에 따라 접근하는 코드도 달라져야 한다는 점을 주의해야 한다!

 

 

11.3 모듈 공개 설정하기 : __all__

패키지는 만든 사람이 공개 범위를 설정할 수 있다. 모듈 중에서 import 되기를 원하는 것만 공개하고 나머지는 비공개로 둘 수가 있는 것이다. 

 travel 패키지를 만들 때 함께 생성한 __init__.py파일을 열어 다음과 같이 내용을 작성한다.

__all__이라는 변수에 리스트 형태로 모듈명을 넣으면 공개로 설정한다. 

__all__ = ["vietnam"]

이후 ch11.py에 *를 사용해 travel 패키지에 있는 모든 기능을 가져다 쓰겠다고 코드를 작성하면 베트남 패키지 여행 상품 정보가 잘 출력된다.

from travel import *
trip_to = vietnam.VietnamPackage()
trip_to.detail()

#[베트남 3박 5일 패키지] 다낭 효도 여행 60만원

베트남뿐만 아니라 태국도 모듈을 모두 공개로 설정해주면 trip_to = thailand.ThailandPackage()의 실행 결과가 잘 뜨는 것을 알 수 있다.

__all__ = ["vietnam", "thailand"]

정확히 말하면 __all__은 from travel import * 와 같이 *를 패키지 내 모듈들을 가져다 쓰려고 하는 경우에 import할 대상을 정의하는 역할을 한다. 패키지 내에 __init__.py파일이 없거나 __all__리스트 안에 아무런 모듈을 넣지 않더라도 from travel import vietnam, thailand와 같이 작성하면 여전히 vietnam, thailand모듈을 사용할 수 있다는 점을 알아둬야 한다.

 

 

11.4 모듈 직접 실행하기

모듈을 직접 실행할지 아니면 별도 파일을 호출해서 실행할지는 다음과 같이 구분한다.

if __name__ == "__main__": #직접 실행하는 경우
	pass
else: #외부에서 호출해 실행하는 경우
	pass

__name__은 현재 모듈(작성한 파이썬 파일)의 이름을 값으로 가지는 내장변수

모듈이 직접 실행되는 경우 __name__의 값은 __main__으로 설정된다.

그래서 앞의 코드와 같이 작성하면 파일이 직접 실행될 때 if문의 동작이 실행된다.

직접 실행되지 않고 외부에서 호출해 사용하면 __main__이 아닌 해당 모듈의 이름을 값으로 가지게 된다.

 

class ThailandPackage:
    def detail(self):
        print("[태국 3박 5일 패키지] 방콕, 파타야 여행(야시장 투어) 50만원")

if __name__ == "__main__": #모듈 직접 실행
    print("thailand 모듈 직접 실행할 때만 출력됨")
    trip_to = ThailandPackage()
    trip_to.detail()
else: #외부에서 모듈 호출
    print("외부에서 thailand모듈 호출")

 

11.5 패키지와 모듈 위치 확인하기

패키지나 모듈은 호출하려는 파일과 동일한 경로에 있거나, 파이썬 라이브러리들이 모여있는 폴더에 있어야 사용할 수 있다. 

* 라이브러리는 재사용을 위해 개발한 코드 묶음이다. 모듈 묶음이 패키지라면, 패키지의 묶음이 라이브러리이다. 사실 파이썬에서 라이브러리는 패키지와 혼용하는 용어라서 둘을 크게 구분하지 않아도 괜찮다.

 

파이썬에서는 getfile()함수로 모듈의 경로를 확인할 수 있다.

getfile()함수는 inspect라는 모듈에 속하므로 먼저 inspect 모듈을 import해야한다. 

random모듈의 경로를 파악해야 하므로 random모듈도 import해야한다.

그런 다음 getfile()함수에 전달값으로 random을 넣은 후 실행하면, 모듈의 경로를 반환한다.

import inspect
import random
print(inspect.getfile(random)) #random모듈위치

#C:\Python38\lib\random.py

lib폴더가 앞에서 말한 '파이썬 라이브러리들이 모여있는 폴더'이다.

 

이번에는 직접 만든 travel 패키지의 thailand모듈이 어느 경로에 위치하는지 확인해보자.

실행해보니 외부에서 thailand 모듈을 호출한다는 문구와 함께 경로가 표시된다. 

PythonWorkspace 폴더의 travel 폴더 안에 thailand 모듈이 위치한다는 것을 알 수 있다.

import inspect
from travel import *
print(inspect.getfile(thailand)) # thailand 모듈위치

# 외부에서 thailand모듈 호출
# 3학년\PythonWorkspace\travel\thailand.py

 

11.6 패키지 설치하기

PyPI는 파이썬용 패키지 저장소이다. 

<pip 명령 사용 방법>

  • install(패키지 설치) : pip install [패키지명]
  • install --upgrade(패키지 업그레이드) : pip install --upgrade [패키지명]
  • uninstall(패키지 삭제) : pip uninstall [패키지명]
  • list(설치 패키지 목록) : pip list
  • show(패키지 상세 정보) : pip show [패키지명]

 

11.7 내장 함수 사용하기

파이썬은 프로그램을 더 빠르고 편리하게 개발할 수 있도록 유용한 기능을 담은 내장함수와 외장함수를 제공한다.

내장함수 : 별도로 import하지 않고도 사용할 수 있는 함수

ex) 사용자에게 입력 받을 때 사용하는 input()함수

ex) dir()함수 : 어떤 객체를 전달값으로 넘기면 이 객체가 어떤 변수와 함수가 가지고 있는지 알려주는 함수

만약 전달값으로 아무것도 넣지 않으면 현재 소스 코드 안에서 사용할 수 있는 모듈 또는 객체를 출력

print(dir())
#['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

import random 
print(dir())
#['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'random']

import pickle
print(dir())
#['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'pickle', 'random']

실행해보면 처음에는 기본값만 출력하고 random모듈을 import한 후에는 random모듈, pickle모듈을 import한 후에는 pickle모듈까지 출력한다.

 

random모듈을 직접 전달값으로 설정하면 그 결과로 random모듈 안에 있는 모든 것을 출력한다.

import random
print(dir(random))

 

이번엔 모듈이 아닌 리스트 자료구조를 만들고 숫자 몇 개를 저장해 전달하면, 리스트에서 사용할 수 있는 변수와 함수 목록이 나온다. 리스트 자료구조를 공부할 때 본 append(), clear(), count(), extend(), index(), reverse(), sort() 등의 함수를 확인할 수 있다.

list = [1, 2, 3]
print(dir(list))

 

name이라는 변수에 문자열을 값으로 넣고 dir()함수로 확인하면 훨씬 더 다양한 내용이 출력된다. upper(), lower(), fine()등 다양한 함수를 사용할 수 있음을 알 수 있다.

name = "Jim"
print(dir(name))

 

 

11.8 외장 함수 사용하기

외장함수는 파이썬을 설치할 때 함께 설치되어 lib 폴더에 담겨있다.

외장함수는 내장함수와는 다르게 반드시 import해야만 프로그램 안에서 사용할 수 있다.

 

11.8.1 폴더 또는 파일 목록 조회 모듈

첫 번째 모듈은 glob이다. glob모듈어떤 경로에 있는 폴더 또는 파일 목록을 조회할 때 사용한다.

윈도우의 명령 프롬프트에서 사용하는 dir명령과 비슷하다. 

glob모듈에는 glob()이라는 함수가 있는데, 파일명 또는 비슷한 형태를 전달하면 해당하는 파일을 조회한다.

 

확장자가 py인 파일 목록을 출력하려면 glob모듈을 import하고 glob()함수에는 *.py를 넣어 전달하면 된다. (*는 모든 것을 지칭할 때 사용하는 와일드카드 문자)

import glob
print(glob.glob("*.py"))

#['ch10(1).py', 'ch10.py', 'ch11.py', 'ch2.py', 'ch3.py', 'ch4.py', 'ch5.py', 'ch6.py', 'ch7.py', 'ch8.py', 'ch9(2).py', 'ch9(3).py', 'ch9.py', 'helloworld.py', 'theater_module.py']

 

11.8.2 운영체제의 기본 기능 모듈

다음으로 사용할 모듈은 os이다. os는 운영체제에서 제공하는 기본기능 정도로 생각하면 된다.

getcwd()함수는 os모듈에 속한 함수로 현재 파이썬 파일을 실행하는 경로 정보를 알려주는 함수이다.

cwd는 현재 작업 폴더(current working directory를 의미한다.)

import os
print(os.getcwd())

 

이번에는 폴더를 하나 만들어보자. 2가지 함수를 사용하는데, 먼저 exists()함수는 주어진 경로에 해당하는 폴더 또는 파일이 존재하는지 여부를 알려준다. makedirs()함수는 현재 위치에 폴더를 새로 생성한다. folder라는 변수에 "sample_dir"이라는 문자열을 값을 넣는다. exists()함수로 folder변수와 같은 이름의 폴더가 존재하는지 확인한다. 같은 이름의 폴더가 존재하지 않으면 makedirs()함수로 새로운 폴더를 생성한다.

path는 경로 정보를 처리하기 위해 os모듈에서 import해서 사용하는 또 다른 모듈이다. os모듈에서 path모듈을 사용하고싶으면 os.path.exists() 와 같이 점으로 연결해 코드를 작성한다.

import os

folder = "sample_dir"
if os.path.exists(folder): #같은 이름의 폴더가 존재한다면
    print("이미 존재하는 폴더입니다.")
else: #폴더가 존재하지 않으면
    os.makedirs(folder) #폴더 생성
    print(folder, "폴더를 생성했습니다.")

# sample_dir 폴더를 생성했습니다.

코드를 실행하면 폴더를 생성했다는 메시지가 출력되고 VSCode탐색기를 보면 작업 폴더에 sample_dir이라는 폴더가 생성되어있다. 앞의 코드를 다시 한 번 실행하면 sample_dir폴더가 존재하므로 출력 내용이 달라진다. "이미 존재하는 폴더입니다."라고 출력된다.

 

같은 이름의 폴더가 있으면 해당 폴더를 삭제하도록 코드를 조금 수정하겠다. 

os모듈의 rmdir()함수를 사용한다. if문에서 rmdir()함수를 호출하면서 folder변수를 전달해 전달값과 같은 이름의 폴더를 삭제한다. 코드를 작성하고 다시 실행하면 sample_dir 폴더가 삭제된다.

import os

folder = "sample_dir"
if os.path.exists(folder): #같은 이름의 폴더가 존재한다면
    print("이미 존재하는 폴더입니다.")
    os.rmdir(folder) #폴더 삭제
    print(folder, "폴더를 삭제했습니다.") #삭제 문구 출력
else: #폴더가 존재하지 않으면
    os.makedirs(folder) #폴더 생성
    print(folder, "폴더를 생성했습니다.")

#이미 존재하는 폴더입니다.
#sample_dir 폴더를 삭제했습니다.

 

os모듈에는 listdir()함수도 있다. glob모듈의 glob()함수와 비슷하게 현재 작업 폴더 안에 있는 폴더와 파일 목록을 출력한다.

import os
print(os.listdir()) #현재 작업 폴더 안의 폴더와 파일 목록 출력

#['ch10(1).py', 'ch10.py', 'ch11.py', 'ch2.py', 'ch3.py', 'ch4.py', 'ch5.py', 'ch6.py', 'ch7.py', 'ch8.py', 'ch9(2).py', 'ch9(3).py', 'ch9.py', 'helloworld.py', 'profile.pickle', 'score.txt', 'study.txt', 'theater_module.py', 'travel', '__pycache__']

 

 

11.8.3 시간 관련 모듈

time모듈을 import 하고 나서 현재 시간 정보를 반환하는 localtime()함수를 호출한다.

import time
print(time.localtime())

# time.struct_time(tm_year=2023, tm_mon=4, tm_mday=4, tm_hour=11, tm_min=59, tm_sec=56, tm_wday=1, tm_yday=94, tm_isdst=0)

 

time모듈에 있는 strftime()함수는 사용자가 원하는 문자열 형태로 시간 정보를 출력할 수 있다.

import time
print(time.strftime("%Y-%m-%d %H:%M:%S"))

# 2023-04-04 12:01:30

 

<시간 관련 함수에 사용하는 날짜/시간 포맷 코드>

%Y : 연(year)

%m : 월(month)

%d : 일(day)

%H : 시(hour)

%M : 분(minute)

%S : 초(second)

 

time과 비슷한 datetime모듈도 있다. datetime모듈을 사용해 오늘 날짜를 출력할 수 있다.

import datetime
print("오늘 날짜는", datetime.date.today())

# 오늘 날짜는 2023-04-04

 

datetime모듈에는 timedelta()라는 함수도 있는데, 이 함수를 사용하면 두 날짜 및 시간 사이의 차이를 계산하거나 일정 시간이 경과한 후의 날짜 등을 구할 수 있다. 만약 오늘 누군가와 만나기 시작했고 오늘로부터 100일째 되는 날을 계산한다고 가정하겠다. 먼저 datetime.date.today()를 사용해 오늘 날짜를 가져와 today라는 변수에 저장한다. 그리고 timedelta()함수를 호출하는데, 100일 뒤가 며칠인지 계산하기 위해 days라는 키워드 인자에 100을 넣는다. 이때 반환하는 값을 td변수에 저장한다. 마지막으로 print()문으로 today변수와 td변수의 값을 더해 100일째의 날짜를 출력한다.

import datetime
today = datetime.date.today() #오늘 날짜 저장
td = datetime.timedelta(days=100) #100일째 날짜 저장
print("우리가 만난 지 100일은", today+td) #오늘부터 100일 후 날짜

#우리가 만난 지 100일은 2023-07-13

 

* 파이썬으로 개발할 때 처음부터 끝까지 모든 기능을 직접 구현하려고 하지 말고, 구글 검색으로 이미 누군가가 잘 만들어 놓은 유용한 라이브러리(패키지, 모듈)를 찾아보는 것이 좋다.

'Python' 카테고리의 다른 글

Type Hinting  (0) 2025.06.24
List Comprehensions  (2) 2025.06.23
나도코딩 파이썬 10장 - 예외 처리  (0) 2023.03.31
나도코딩 파이썬 9장 - 클래스  (0) 2023.03.27
나도코딩 파이썬 8장 - 입출력  (0) 2023.03.24