soma0sd

코딩 & 과학 & 교육

Python 패키지 개발일지 03: PyPI에 패키지 올리기

반응형

이전 포스트에서는 깃허브(GitHub)에 패키지를 저장소 형태로 게시하는 방법을 소개했습니다. 이 작업은 깃허브 저장소를 패키지의 홈페이지로 사용하기 위한 것입니다. 무료로 소스코드와 홈페이지를 호스팅해주는 곳은 몇 군데 없으니까요. 게다가 버전관리와 이슈트래커 파일관리 협업 등 깃허브를 시용하는 것은 여러가지 이점을 가집니다.

이번에는 패키지를 배포하기 위한 파이썬 패키지 인덱스(PyPI)에 패키지를 업로드하여 다른 사람들이 손쉽게 만든 패키지를 이용할 수 있도록 하는 작업을 하도록 하겠습니다.

PyPI 계정 등록

가장 먼저 PyPI에 계정을 생성해야 합니다. PyPI의 계정은 패키지를 프로젝트 단위로 관리할 수 있도록 해줍니다. 계정을 생성한 후에는 아직은 패키지를 업로드하지 않았으니 PyPI는 나중에 들르도록 하겠습니다.

패키지 업로드

몇가지 도구를 이용해 PyPI에 패키지의 첫 번째 버전을 릴리즈 하도록 하겠습니다.

필요한 패키지

패키지 설치

pip install setuptools twine

Anaconda의 경우

conda install -c anaconda setuptools
conda install -c conda-forge twine

setuptools는 패키지를 묶어 *.whl(wheel) 파일로 만들어줍니다. 만들어진 {package}.whltwine을 통해 PyPI로 전송하면 내 프로젝트에 새로운 패키지가 등록됩니다.

setup.py 만들기

입력한 패키지 정보를 기반으로 wheel 파일을 만드는 setup.py를 작성합니다.

autowinpy/
  ├─ docs/
  ├─ autowinpy/
  │  ├─ __init__.py
  │  └─ ....py
  ├─ .gitignore
  ├─ LICENSE
  ├─ readme.md
  └─ setup.py

패키지를 만든 저장소는 대강 이런 모습이 됩니다. 보이는대로 프로젝트 최상위에 setup.py를 만들고 내용을 채웁니다. 가장 단순한 형태는 이렇습니다.

from setuptools import setup, find_packages
setup(
    name="my_package",
    version="0.1.0",
    packages=find_packages(),
)

만든 뒤에,

python setup.py bdist_wheel

을 사용하면 wheel 패키지 설치파일이 ./dist/ 경로에 들어있게 됩니다.

setup()의 매개변수

아무런 정보도 없는 패키지를 PyPI에 올리면 이름과 버전만 덜렁 남아닜는 휑한 패키지 정보 페이지가 됩니다. 사용자들에게 다양한 정보를 제공하려면 setup.py안의 setup() 함수에 매개변수들을 채워넣는 것이 좋습니다.

  • name: (필수) 패키지 이름
  • version: (필수) 패키지 버전
  • packages: (필수) 패키지
    • find_packages(exclude=""): 제외할 패키지
  • author: 제작자
  • author_email: 제작자의 메일주소
  • url: 패키지의 홈페이지
  • description: 단순한 설명
  • long_description: 자세한 설명
  • long_description_content_type: 자세한 설명이 가지고 있는 포맷
  • install_requires: 패키지 종속성
  • keywords: 패키지 키워드
  • python_requires: 요구하는 파이썬 버전
  • license: 패키지 라이센스
  • classifiers: 분류

setup.py를 저장소와 연동하기

패키지 버전 연동

setup.py와 저장소를 서로 연동하면 매 릴리즈때마다 setup()의 내용을 수고롭게 수정할 필요가 없습니다.

autowinpy/
  ├─ docs/
  ├─ autowinpy/
  │  ├─ __init__.py
  │  └─ ....py
  ├─ .gitignore
  ├─ LICENSE
  ├─ readme.md
  └─ setup.py

autowinpy/autowinpy/__init__.py를 열어 버전을 기입합니다.

"""
패키지 __init__.py
"""
__version__ = "0.1.1"

동기화의 목적도 있지만 패키지에 버전을 명시하면 발생할 문제에 대처하기가 조금 더 쉬워집니다. 또한 이후에 메뉴얼을 제작할 때에도 도움이 됩니다.

그럼이제 setup.py를 수정합니다. 버전 연동과 더불어 저장소에서 관리하는 파일을 불러와서 추가하도록 합니다.

from setuptools import setup, find_packages
import {패키지}

VERSION = {패키지}.__version__

def file(path: str) -> str:
    with open('readme.md', encoding='utf8') as f:
        description = f.read()
    return description

setup(
  ...
  version      = VERSION,
  download_url = 'https://github.com/{유저이름}/{패키지}/archive/{}.tar.gz'.format(VERSION),
  ...
  long_description              = file('readme.md'),
  long_description_content_type = 'text/markdown',
  ...
)

이 방식으로 완성한 autowinpy/setup.py와 그 결과물 PyPI:autowinpy를 참고하시면 도움이 될 것입니다.

반응형
태그:

댓글

End of content

No more pages to load