Python 유용한 생산성 라이브러리
작성일:
파이썬으로 개발할 때 생산성을 크게 향상시켜주는 유용한 라이브러리들을 소개합니다.
tqdm
간략 설명
tqdm은 “taqaddum”의 약자로, 아랍어로 “진행”을 의미합니다. 긴 작업의 진행 상황을 시각적으로 보여주는 스마트한 프로그레스 바를 쉽게 추가할 수 있게 해주는 라이브러리입니다.
사용 잇점
- 작업의 진행률을 시각적으로 확인할 수 있어 대기 시간을 예측하고 지루함을 덜 수 있습니다.
- 반복문(loop)에 간단하게 적용할 수 있어 코드 수정이 거의 필요 없습니다.
- 처리 속도, 남은 시간 등 유용한 정보를 함께 표시해줍니다.
설치
pip install tqdm
간략 예제 코드
import time
from tqdm import tqdm
for i in tqdm(range(100), desc="Processing"):
time.sleep(0.05)
실행 결과
Processing: 100%|██████████| 100/100 [00:05<00:00, 19.99it/s]
추가 예제: 리스트와 함께 사용
tqdm은 리스트 컴프리헨션이나 제너레이터 표현식과도 잘 동작합니다.
from tqdm import tqdm
import time
def process_item(item):
time.sleep(0.01)
return item * item
my_list = range(200)
results = [process_item(item) for item in tqdm(my_list, desc="Processing List")]
실행 결과
Processing List: 100%|██████████| 200/200 [00:02<00:00, 99.89it/s]
비슷한 다른 추천 라이브러리
alive-progress:tqdm보다 더 화려하고 다양한 애니메이션 효과를 제공합니다.
Typer
간략 설명
Typer는 파이썬의 타입 힌트(type hints)를 기반으로 강력하고 사용하기 쉬운 CLI(Command-Line Interface) 애플리케이션을 만드는 라이브러리입니다.
사용 잇점
- 타입 힌트를 그대로 사용하여 CLI 인자와 옵션을 정의하므로 코드가 간결하고 명확해집니다.
- 자동 완성(autocompletion) 기능을 쉽게 추가할 수 있습니다.
- 도움말 메시지를 자동으로 생성해주어 사용자가 CLI를 쉽게 이해하고 사용할 수 있도록 돕습니다.
설치
pip install "typer[all]"
간략 예제 코드
import typer
def main(name: str, age: int = 20):
"""
Say hi to NAME, optionally with a --age.
"""
print(f"Hello {name}, you are {age} years old.")
if __name__ == "__main__":
typer.run(main)
실행 결과
# 터미널에서 실행
$ python exapp.py Alice
Hello Alice, you are 20 years old.
$ python exapp.py Bob --age 30
Hello Bob, you are 30 years old.
$ python exapp.py --help
Usage: exapp.py [OPTIONS] NAME
Say hi to NAME, optionally with a --age.
Arguments:
NAME [required]
Options:
--age INTEGER [default: 20]
--help Show this message and exit.
추가 예제: 서브커맨드 만들기
Typer를 사용하면 서브커맨드를 만드는 것도 매우 간단합니다.
import typer
app = typer.Typer()
@app.command()
def create(username: str):
print(f"Creating user: {username}")
@app.command()
def delete(username: str):
print(f"Deleting user: {username}")
if __name__ == "__main__":
app()
실행 결과
$ python exapp create Alice
Creating user: Alice
$ python exapp delete Bob
Deleting user: Bob
$ python exapp --help
Usage: exapp [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
create
delete
비슷한 다른 추천 라이브러리
Click:Typer의 기반이 되는 라이브러리로, 데코레이터를 사용하여 CLI를 구성합니다. 더 복잡한 커스터마이징이 필요할 때 좋습니다.argparse: 파이썬 표준 라이브러리로, 외부 의존성 없이 사용할 수 있지만Typer보다 코드가 장황해질 수 있습니다.
icecream
간략 설명
icecream은 print() 문을 대체하여 변수 이름, 값, 그리고 코드가 실행된 위치를 함께 출력해주는 디버깅용 라이브러리입니다.
사용 잇점
print(f'{my_var=}')와 같은 코드를ic(my_var)로 간단하게 줄일 수 있습니다.- 변수 이름과 값이 함께 출력되어 어떤 변수를 확인하는지 명확하게 알 수 있습니다.
- 함수 호출 시 인자 없이
ic()만 사용해도 실행된 라인과 함수 이름을 알려주어 코드 흐름을 파악하기 좋습니다.
설치
pip install icecream
간략 예제 코드
from icecream import ic
def my_function(a, b):
ic()
result = a + b
ic(a, b, result)
return result
my_function(1, 2)
실행 결과
ic| exapp.py:4 in my_function()
ic| exapp.py:6: a=1, b=2, result=3
추가 예제: 출력 설정 변경하기
icecream은 출력 형식이나 포함되는 정보를 커스터마이징 할 수 있습니다.
from icecream import ic
import time
def get_timestamp():
return time.strftime('%H:%M:%S')
ic.configureOutput(prefix=f'{get_timestamp()} | ')
def expensive_calculation():
ic()
time.sleep(0.5)
return "done"
expensive_calculation()
실행 결과
22:30:15 | exapp.py:11 in expensive_calculation()
비슷한 다른 추천 라이브러리
snoop:icecream보다 더 상세한 정보를 제공하며, 함수의 실행 과정을 한 줄 한 줄 추적해줍니다.
pytest
간략 설명
pytest는 간단하고 확장 가능한 테스트 프레임워크입니다. 복잡한 설정 없이도 강력한 테스트를 작성할 수 있게 도와줍니다.
사용 잇점
assert문을 그대로 사용하여 테스트 케이스를 작성할 수 있어 코드가 간결합니다.- Fixture라는 강력한 기능을 통해 테스트의 전후 준비 및 정리 과정을 쉽게 관리할 수 있습니다.
- 풍부한 플러그인 생태계를 통해 커버리지 측정, 병렬 테스트 등 다양한 기능을 쉽게 추가할 수 있습니다.
설치
pip install pytest
간략 예제 코드
# test_example.py
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
터미널에서 pytest 실행
실행 결과
============================= test session starts ==============================
platform darwin -- Python 3.9.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /path/to/your/project
collected 1 item
test_example.py . [100%]
============================== 1 passed in 0.01s ===============================
추가 예제: Fixture 사용하기
fixture는 테스트 함수들이 실행되기 전에 필요한 데이터나 객체를 설정하고, 테스트가 끝난 후 정리하는 데 사용됩니다.
# test_app.py
import pytest
@pytest.fixture
def sample_data():
"""Fixture to provide sample data to tests."""
return {"user": "Alice", "items": [1, 2, 3]}
def test_user_name(sample_data):
assert sample_data["user"] == "Alice"
def test_items_count(sample_data):
assert len(sample_data["items"]) == 3
실행 결과
============================= test session starts ==============================
...
collected 2 items
test_app.py .. [100%]
============================== 2 passed in 0.02s ===============================
비슷한 다른 추천 라이브러리
unittest: 파이썬 표준 라이브러리로, xUnit 스타일의 테스트를 작성할 수 있습니다.pytest보다 구조가 더 복잡할 수 있습니다.Nose2:unittest의 확장 버전으로, 테스트를 더 쉽게 작성하고 실행할 수 있도록 도와줍니다.
Loguru
간략 설명
Loguru는 파이썬의 기본 logging 모듈을 더 쉽고 강력하게 사용할 수 있도록 만든 로깅 라이브러리입니다.
사용 잇점
- 최소한의 설정으로 바로 사용할 수 있으며, 색상 구분, 파일 로깅, 로테이션 등을 매우 쉽게 설정할 수 있습니다.
- 예외(Exception) 발생 시 스택 트레이스를 자동으로 포함하여 디버깅에 유용한 정보를 제공합니다.
- 문자열 포매팅이 내장되어 있어
logger.info(f"User {user_id} logged in")와 같이 직관적으로 사용할 수 있습니다.
설치
pip install loguru
간략 예제 코드
from loguru import logger
logger.add("file_{time}.log", rotation="500 MB") # 500MB 마다 로그 파일 분리
logger.debug("This is a debug message.")
logger.info("This is an info message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")
try:
1 / 0
except ZeroDivisionError:
logger.exception("What?!")
실행 결과
(터미널에 아래와 같이 출력되며, file_2025-11-17_... .log 파일이 생성됩니다)
2025-11-17 22:10:00.123 | DEBUG | __main__:<module>:5 - This is a debug message.
2025-11-17 22:10:00.123 | INFO | __main__:<module>:6 - This is an info message.
2025-11-17 22:10:00.123 | WARNING | __main__:<module>:7 - This is a warning message.
2025-11-17 22:10:00.123 | ERROR | __main__:<module>:8 - This is an error message.
2025-11-17 22:10:00.124 | ERROR | __main__:<module>:13 - What?!
Traceback (most recent call last):
File "exapp.py", line 11, in <module>
1 / 0
ZeroDivisionError: division by zero
추가 예제: JSON 형식으로 로그 남기기
구조화된 로깅을 위해 로그를 JSON 형식으로 저장할 수 있습니다.
from loguru import logger
import sys
logger.remove() # 기본 핸들러 제거
logger.add(sys.stderr, format="{message}")
logger.add("logs.json", serialize=True)
user_data = {"id": 123, "name": "Bob"}
logger.bind(user=user_data).info("User logged in")
실행 결과
(터미널에는 포맷에 따라 message만 출력됩니다)
User logged in
(logs.json 파일에 아래와 같은 내용이 기록됩니다)
{"text": "User logged in\n", "record": {"elapsed": {"repr": "0:00:00.002453", "seconds": 0.002453}, "exception": null, "extra": {"user": {"id": 123, "name": "Bob"}}, "file": {"name": "exapp.py", "path": "/path/to/exapp.py"}, "function": "<module>", "level": {"icon": "ℹ️", "name": "INFO", "no": 20}, "line": 10, "message": "User logged in", "module": "your_script_name", "name": "__main__", "process": {"id": 12345, "name": "MainProcess"}, "thread": {"id": 54321, "name": "MainThread"}, "time": {"repr": "2025-11-17 22:45:00.543210+09:00", "timestamp": 1763435100.54321}}}
비슷한 다른 추천 라이브러리
logging: 파이썬 표준 라이브러리로, 매우 유연하고 강력하지만 초기 설정이 복잡할 수 있습니다.
python-dotenv
간략 설명
.env 파일에 저장된 환경 변수를 코드 내에서 쉽게 불러와 사용할 수 있게 해주는 라이브러리입니다.
사용 잇점
- API 키, 데이터베이스 비밀번호 등 민감한 정보를 코드와 분리하여 안전하게 관리할 수 있습니다.
- 개발, 테스트, 운영 환경에 따라 다른 설정을
.env파일을 통해 쉽게 주입할 수 있습니다. os.environ을 통해 환경 변수를 사용하므로, 12-Factor App 원칙을 따르기 용이합니다.
설치
pip install python-dotenv
간략 예제 코드
# .env 파일
API_KEY="your_secret_api_key"
DEBUG="True"
# main.py
import os
from dotenv import load_dotenv
load_dotenv() # .env 파일의 환경 변수를 로드합니다.
api_key = os.getenv("API_KEY")
debug_mode = os.getenv("DEBUG")
print(f"API Key: {api_key}")
print(f"Debug Mode: {debug_mode}")
실행 결과
API Key: your_secret_api_key
Debug Mode: True
추가 예제: os.environ을 수정하지 않고 값 가져오기
load_dotenv()는 os.environ을 직접 수정합니다. 만약 환경 변수를 딕셔너리 형태로만 가져오고 싶다면 dotenv_values를 사용할 수 있습니다.
# .env 파일은 위와 동일
from dotenv import dotenv_values
config = dotenv_values(".env")
print(f"API Key from config: {config['API_KEY']}")
print(f"Debug mode from config: {config['DEBUG']}")
실행 결과
API Key from config: your_secret_api_key
Debug mode from config: True
비슷한 다른 추천 라이브러리
pydantic-settings: Pydantic 모델을 사용하여 환경 변수를 타입 검증과 함께 불러올 수 있어 더욱 안정적인 설정 관리가 가능합니다.
댓글남기기