작성일:

파이썬으로 개발할 때 생산성을 크게 향상시켜주는 유용한 라이브러리들을 소개합니다.

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

간략 설명

icecreamprint() 문을 대체하여 변수 이름, 값, 그리고 코드가 실행된 위치를 함께 출력해주는 디버깅용 라이브러리입니다.

사용 잇점

  • 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 모델을 사용하여 환경 변수를 타입 검증과 함께 불러올 수 있어 더욱 안정적인 설정 관리가 가능합니다.

댓글남기기