개발 기타

Python package 개발과 PyPI 배포

깨비아빠0 2023. 11. 15. 12:20
728x90
반응형

ml 스터디를 하면서 작성한 코드를 패키지로 만들기 위해 파이썬 패키지 개발 및 배포에 대해 찾아보았다.

 

https://packaging.python.org/en/latest/tutorials/packaging-projects/

 

Packaging Python Projects - Python Packaging User Guide

Previous Managing Application Dependencies

packaging.python.org

 

위 튜토리얼을 따라서 비교적 간단하게 ml 유틸리티 패키지를 빌드하고 PyPI에 배포할 수 있었다.

 

kebiml

A simple private ml utilities

pypi.org

 

 

패키지 프로젝트 구조

packaging_tutorial/    (임의의_프로젝트_이름)
├─ LICENSE
├─ pyproject.toml
├─ README.md
├─ src/
 │     └─ example_package_YOUR_USERNAME_HERE/    (패키지 이름)
 │            ├─ __init__.py
 │            └─ example.py    (배포할 코드)
└─ tests/

 

임의의 프로젝트 폴더 밑에 LICENSE, README.md, pyproject.toml 파일과 src, tests 폴더를 만든다.

src 폴더 밑에 배포할 패키지 이름과 같은 이름으로 폴더를 만든다. (달라도 되지만 일치시키는게 좋다.)

github 저장소 생성시 README.md와 LICENSE를 기본으로 추가할 수 있으므로, github 저장소를 먼저 만든 후에 패키지 개발을 진행하는게 편하다.

 

metadata 작성 (pyproject.toml)

아래와 같이 pyproject.toml을 작성하며, name, email, Licence 등의 내용을 원하는 대로 수정하면 된다.

[build-system] 섹션은 어떤 빌드 백엔드를 사용하는지에 따라 달라지는데, 빌드 백엔드에는 Hatchling, setuptools, Flit, PDM 등이 있다. 

[build-system] --> 빌드 백엔드에 따라 달라짐
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
  { name="Example Author", email="author@example.com" },
]
description = "A small example package"
readme = "README.md"
requires-python = ">=3.8"
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]
dependencies = [ --> 종속 패키지 목록 (튜토리얼에는 없으나 보통 필요하므로 추가함)
    "numpy~=1.21",
    "scikit-learn~=1.3.2",
    "matplotlib~=3.7",
]

[project.urls]
"Homepage" = "https://github.com/pypa/sampleproject"
"Bug Tracker" = "https://github.com/pypa/sampleproject/issues"

 

패키지 빌드

다음 명령으로 build 패키지를 설치하고, 패키지 빌드를 실행할 수 있다.

python3 -m pip install --upgrade build
python3 -m build

 

빌드에 성공하면 아래와 같이 dist 폴더에 배포할 패키지 파일이 만들어진다.

dist/
├─ example_package_YOUR_USERNAME_HERE-0.0.1-py3-none-any.whl
└─ example_package_YOUR_USERNAME_HERE-0.0.1.tar.gz

 

패키지 배포

배포를 위해 먼저 PyPI 계정을 생성해야 한다.

TestPyPI에서 먼저 배포 테스트를 해보고 싶다면 https://test.pypi.org/account/register/, 실제 PyPI에 배포하려면 https://pypi.org/account/register/ 에서 계정을 생성한다

튜토리얼에서는 TestPyPI 배포만 다루고 있는데, PyPI도 주소만 다를 뿐 동일한 과정을 거친다.
테스트 없이 바로 PyPI에 배포해도 무방하다.
단, 안정적인 배포를 원한다면, 예를 들어, "배포 -> 패키지 설치 테스트 -> 실행 테스트" 과정을 배포 프로세스에 포함하고 싶다면, TestPyPI를 사용하는 것이 좋을 것 같다.
(특히 한 번 올린 패키지와 같은 이름의 파일을 덮어 쓸 수 없기 때문에, 배포 후에 수정할 내용을 발견했을 때 버전을 올리거나 파일명을 수정해야 하는 문제도 생길 수 있다.)

 

배포를 위한 API Token을 생성하기 전에 Two-factor 인증이 필요한데, 폰에 PyPI에서 추천해주는 인증앱을 설치하고 진행하면 된다.

이후 Account settings > API tokens > Add API Token 버튼을 눌러 Create API token 화면으로 이동하여 API Token을 생성한다. (PyPI 주소 https://pypi.org/manage/account/token/)

Entire account Scope을 선택하고 Token name을 입력한 후에 Create token을 클릭한다.

 

패키지 업로드는 twine 패키지를 사용하는데, 아래와 같이 설치해준다.

python3 -m pip install --upgrade twine

 

이후에 아래 명령을 실행하면 패키지가 PyPI에 업로드된다. (TestPyPI에 올릴 경우 --repository 옵션 사용)

(TestPyPI)
python3 -m twine upload --repository testpypi dist/*

(PyPI)
python3 -m twine upload dist/*

 

배포한 패키지 설치

다음 명령으로 패키지 설치가 가능하다. (TestPyPI에서 설치할 경우 --index-url 옵션 사용)

(TestPyPI)
python3 -m pip install --index-url https://test.pypi.org/simple/ example-package-YOUR-USERNAME-HERE

(PyPI)
python3 -m pip install example-package-YOUR-USERNAME-HERE
반응형

'개발 기타' 카테고리의 다른 글

JavaScript/TypeScript 노트북 vscode 플러그인  (0) 2023.12.26