파이썬 패키지 배포는 pyproject.toml 기반이 표준입니다. 이 치트시트는 pyproject.toml 구조, build + twine으로 PyPI 배포, 의존성 명세, 배포 전 체크리스트를 정리합니다.
언제 이 치트시트를 보나?
- 내가 만든 라이브러리를 pip install로 설치 가능하게 만들고 싶을 때
- PyPI에 패키지를 배포하고 싶을 때
핵심 패턴
- 설정 파일:
pyproject.toml (PEP 517/518/621 표준) - 빌드:
python -m build → dist/ 폴더에 wheel + sdist 생성 - 업로드:
twine upload dist/* - 개발 모드 설치:
pip install -e .
pyproject.toml 기본 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| [build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-package"
version = "0.1.0"
description = "A short description"
readme = "README.md"
license = {text = "MIT"}
authors = [
{name = "Your Name", email = "you@example.com"}
]
requires-python = ">=3.8"
# 의존성
dependencies = [
"requests>=2.28",
"click>=8.0",
]
# 선택적 의존성 (pip install my-package[dev])
[project.optional-dependencies]
dev = [
"pytest>=7.0",
"black",
"mypy",
]
# CLI 엔트리포인트
[project.scripts]
my-cli = "my_package.cli:main"
[project.urls]
Homepage = "https://github.com/you/my-package"
Documentation = "https://my-package.readthedocs.io"
|
빌드 및 배포
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 필요 도구 설치
pip install build twine
# 빌드 (dist/ 폴더 생성)
python -m build
# TestPyPI에 먼저 테스트 업로드
twine upload --repository testpypi dist/*
# TestPyPI에서 설치 테스트
pip install --index-url https://test.pypi.org/simple/ my-package
# 실제 PyPI 업로드
twine upload dist/*
|
개발 모드 설치
1
2
3
4
5
| # 소스 코드 변경이 바로 반영됨
pip install -e .
# 선택적 의존성 포함
pip install -e ".[dev]"
|
프로젝트 구조 예시
1
2
3
4
5
6
7
8
9
10
11
| my-package/
├── pyproject.toml
├── README.md
├── LICENSE
├── src/
│ └── my_package/
│ ├── __init__.py
│ ├── core.py
│ └── cli.py
└── tests/
└── test_core.py
|
1
2
3
| # src 레이아웃 사용 시 추가 설정
[tool.setuptools.packages.find]
where = ["src"]
|
배포 전 체크리스트
자주 하는 실수/주의점
- 패키지 이름 충돌: PyPI에 이미 있는 이름은 사용 불가 → 먼저 검색
- 버전 형식: PEP 440 준수 (예:
1.0.0, 1.0.0a1) __init__.py 없으면 패키지로 인식 안 됨MANIFEST.in 또는 pyproject.toml의 include로 데이터 파일 포함 필요- PyPI 업로드 후에는 같은 버전 덮어쓰기 불가 → 새 버전으로 올려야 함
관련 링크(공식 문서)