[Python] PyPI에 패키지 배포하기
이번 포스팅에서는 직접 만든 패키지를 PyPI에 배포하는 방법에 대해 살펴보겠습니다.
여기서 소개드린 방법 외로도 다양하게 가능하지만, 좀 더 쉽고 간단하게 하실 수 있도록 한 가지 방법만 소개시켜드리는 것이니 유일한 방법으로 오해하지 않으시길 바랍니다.
Create Project
먼저, 배포할 패키지 내용을 작성해 보겠습니다.
예제로 단순하게 인사말을 출력하는 패키지를 만들어 볼게요.
root/
└── src/
└── hpractice/
├── __init__.py
└── main.py
나중에 프로젝트가 확장될 것을 고려하여 미리 이런 구조를 잡았습니다.
간단한 프로젝트라면 src 폴더 하위에 코드를 넣어도 되지만, 나중에 확장되어 유닛테스트 등이 생길 것을 고려하여 미리 폴더를 한 겹 더 감쌌습니다.
이름은 배포할 패키지 명으로 하셔야 하며, 내부 파일 명은 원하시는 대로 하시면 됩니다.
사용하는 사람이 없어서 저는 hpractice라는 이름을 선정했습니다. 유일한 이름이어야 하니 각자 배포할 패키지 명도 잘 고려하셔야 합니다.
또한, 사용자들은 __init__.py에 명시한 API만 볼 수 있으니 이 점도 미리 고려를 하시면 좋을 것 같습니다.
# main.py
def greeting(name: str) -> None:
print(f"Hello, {name}")
# __init__.py
from .main import greeting
__all__ = [greeting]
Create Package Files
이제, 배포할 패키징을 위한 파일들을 추가해 주도록 하겠습니다.
root/
├── README.md
├── LICENSE
├── pyproject.toml
└── src/
└── hpractice/
├── __init__.py
└── main.py
README.md에는 사용자에게 소개할 내용을 작성해 줍니다.
패키지에 관한 설명, 사용법 등의 내용이 들어가면 좋습니다.
LICENSE에는 이 패키지가 따르는 라이센스를 명시해주면 됩니다.
작성이 어렵다면 GitHub이나 다음 사이트의 도움을 받을 수 있습니다.
https://choosealicense.com/
pyproject.toml은 가장 중요한 파일로 PyPI에 배포될 중요 정보들을 명시해주면 됩니다.
상세 내용은 다음 사이트를 참고해 작성하시면 됩니다.
https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#writing-pyproject-toml
https://pypi.org/classifiers/
[project]
name = "hpractice"
version = "0.0.1"
authors = [
{ name="llHoYall", email="hoya@example.com" },
]
description = "My package for practicing to deploy on PyPI."
readme = "README.md"
requires-python = ">=3.8"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
저는 위와 같이 간단히 작성을 해보았습니다.
제일 중요한 필드는 name과 version으로 유일한 값이어야 합니다.
동일한 값으로는 두 번 다시 배포할 수 없으니 신중하게 작성해야 합니다.
Generates Distribution Archives
이제 작성한 파이썬 패키지를 배포를 위한 형태로 패키징 해보겠습니다.
예전과 달리 간편한 툴이 있으므로, 설치 후 사용해 보겠습니다.
$ pip install build
$ python -m build
dist 폴더에 배포를 위한 파일들이 생성되는 것을 확인하실 수 있습니다.
Create Account
당연한 소리겠지만, PyPI에 배포를 위해선 계정을 만들어야 합니다.
https://pypi.org/
계정이 없다면 계정을 생성하시고, 계정 확인 및 2FA 등록까지 해주세요.
완료가 되었다면 이제 배포 자동화를 위한 토큰을 발급 받도록 하겠습니다.
Account settings 메뉴로 가셔서 스샷을 참고해서 API tokens 메뉴로 가주세요.
혼동 방지를 위해 기존에 사용하던 토큰은 블러 처리를 해두었습니다.
Add API token 버튼을 눌러 토큰 생성 단계로 갑니다.
원하는 토큰명과 범위를 지정한 후, Create token 버튼을 눌러 토큰을 생성합니다.
토큰이 생성되면 친절하게 등록 방법을 알려줍니다.
# $HOME/.pypirc
[pypi]
username = __token__
password =
위와 같이 HOME 디렉토리에 .pypirc 파일을 생성 후, 내용을 넣으신 후, password 필드에 방금 생성된 토큰 값을 넣어주시면 완료입니다.
개인적으로, PyPI 사이트에 바로 배포하시기 보다는 test 사이트를 이용하여 연습을 해보시고 제대로 될 때 정식으로 배포하시는 편을 권장드립니다.
https://test.pypi.org/manage/projects/
Upload the Distribution Archives
배포는 예전처럼 twine을 사용하여 간편하게 할 수 있습니다.
먼저, 설치를 해 줍니다.
$ pip install twine
테스트 사이트와 공식 사이트의 배포 방법이 약간 차이가 있습니다.
$ twine upload --repository testpypi dist/*
$ twine upload dist/*
테스트 사이트에 배포할 경우 위와 같이 해주시고, 공식 사이트에 배포할 경우 아래와 같이 해주시면 됩니다.
이제, 배포한 곳으로 가서 잘 등록 되었는지 확인해 봅니다.
해당 사이트로 이동하신 후, 검색 창에 pyproject.toml 파일에 적은 name을 입력해서 찾아보시면 되요.
예제와 같은 경우는 하기 주소와 같습니다.
https://pypi.org/project/hpractice/
Use the Package
이제 배포한 패키지를 사용자 입장에서 사용해 보겠습니다.
또다른 파이썬 프로젝트를 생성하고, 만든 패키지를 설치합니다.
설치 방법도 테스트 서버와 공식 서버를 사용할 때의 방법이 각각 다릅니다.
$ pip install hpractice
$ pip install --index-url https://test.pypi.org/<PROJECT_NAME>/
이제, 코드를 작성해 보겠습니다.
import hpractice
hpractice.greeting('HoYa')
문제없이 잘 동작하네요. 😁
Wrap Up
이번에는 내가 만든 패키지를 다른 사람들이 손쉽게 사용하도록 PyPI에 배포하는 방법에 대해 살펴보았습니다.
좋은 패키지 많이 만들어서 배포하시는 데, 제 가이드가 조금이나마 도움이 되시길 바랍니다.