Python 패키지 만들고 배포하기

내가 만든 파이썬 패키지를 pip로 어떤 PC에서나 설치하고자 한다면 ‘PyPI’를 이용해야합니다. PyPI파이썬 재단이 운영하는 공식 패키지 저장소라고 생각하면 이해가 쉬울 겁니다.

 

PyPI에 패키지를 등록하기 위해서 어떤 절차가 필요한지, 또 소스 코드를 포함하여 어떤 준비물이 필요한지 정리하였습니다.

 

1. 프로젝트 구성


개발한 소스 코드를 패키징하기 위해서는 코드 트리가 아래와 같은 구조여야합니다.

. 
├── dist                           # 빌드 결과물이 저장되는 디렉토리
├── pyrotestlib                    
|  ├── subdir1                     # 하위 디렉토리 1
|  ├── subdir2                     # 하위 디렉토리 2
|  ├── ...
|  ├── module1.py                  # 모듈 파일 1
|  ├── module2.py                  # 모듈 파일 2
|  ├── ...
|  └── __init__.py                 # 패키지 import 구조
├── setup.py                       # 빌드 설정 파일
├── LICENSE                        # 라이센스
└── README.md                      # 도움말

 

예시로 만든 프로젝트 구조를 참고하면 좋습니다.

 

여기서는 패키지를 pyrotestlib으로 작명하였습니다. 패키지 이름과 동일한 디렉토리를 만들고 그 안에는 개발된 모든 소스 코드가 들어가야 하는데요. 예시니까 간단하게 함수(testfunc) 하나만 구현하였습니다.

 

setup.py 작성

setup.py는 패키지의 기본 정보와 다른 패키지 간의 의존성을 명시하는 설정 파일입니다. 예시로 작성한 setup.py을 함께 보면서 어떤 내용들이 채워져야 하는지 확인해봅니다.

from setuptools import setup, find_packages

__version__ = "0.0.1"

with open('README.md', encoding='utf-8') as f:
    readme = f.read()

if __name__ == "__main__":
    setup(
        name='pyrotestlib',
        version=__version__,
        long_description=readme,
        long_description_content_type='text/markdown',
        description='Python package for a test',
        author='Pyro-Maniac',
        author_email='mgarrixx04@gmail.com',
        url='https://github.com/mgarrixx/pyrotestlib',
        install_requires=['distlib', 'idna'],
        packages=find_packages(exclude=[]),
        keywords=['embedded', 'log collector'],
        python_requires='>=3.7',
    )
  • name: 패키지 이름
  • version: pypi에 표시될 latest 버전
  • description: 패키지 설명
  • author: 본인 pypi 계정
  • author_email: 본인 email
  • url: 원본 소스가 있는 페이지 주소 (ex., github repo)
  • install_requires: 설치 시에 같이 필요한 패키지
  • packages: 파이썬 import packages
  • python_requires: 파이썬 버전

 

README.md / LICENSE 작성

필수는 아니지만, 나중에 다른 사용자가 해당 패키지에 관한 문서나 저작권 요소를 검색하는 경우를 대비할 수 있어야 합니다. 이를 위해 빌드하기 전, README.mdLICENSE 파일을 만들어 두면 PyPI 저장소에 설명서와 라이센스 정보를 동시에 등재할 수 있습니다.

 

2. PyPI 계정 생성 / 설정


 

계정 생성

 

PyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

pypi.org

 

위 링크로 들어가 사용자 계정을 만들고 이메일 인증까지 해줍시다.

 

2차 인증 수단 추가

PyPI는 가입만 했다고 해서 업로드 권한을 막 주지 않기 때문에, 복잡한 인증 절차가 요구됩니다.

 

우측 계정명을 클릭한 뒤 Account setting으로 들어가, 아래로 스크롤을 내리다보면 ‘Two factor authentication (2FA)’라는 항목이 존재합니다.

 

Generate recovery codes 버튼을 클릭하면 여러 줄의 코드가 화면에 표시됩니다. 어딘가에다 받아 적든, 아래 Save를 클릭하여 파일로 내려받든 간에 안전한 곳에 기록을 합니다.

 

바로 옆의 Continue 버튼을 누르면 발급 받은 코드를 재차 확인하는 프로세스로 넘어갑니다. 아까 화면에 표시된 8개 가량의 코드 중 임의로 하나를 선택하여 입력한 뒤, Verify 버튼을 클릭하여 넘어갑니다.

 

이제 2차 인증 수단인 TOTP 설정 단계를 진행합니다. 앞의 과정을 마무리하고 넘어가진 페이지에서 Add 2FA with authentication application이라는 버튼을 클릭합니다.

 

이제 개인이 가진 휴대폰에서 플레이스토어/앱스토어를 켠 뒤 OTP 프로그램(ex., Google Authenticator)을 다운로드 받습니다.

 

PC 화면에 띄워진 QR 코드를 휴대폰 카메라로 찍고, 앱에서 주는 인증 코드 6자리를 PC 화면에 입력합니다.

 

이제 앞으로 PyPI 저장소에 로그인하거나 패키지를 업로드할 때, 항상 2차 인증을 수행하게 될텐데요. 그렇기 때문에 휴대폰에 설치한 TOTP 인증 앱을 귀찮더라도 삭제하지 말고 설치된 채로 계속 두는 것이 좋습니다.

 

API token 발급

패키지 업로드는 터미널 인터페이스에서 이뤄지므로, PyPI 계정 연동을 위해 ‘API token’이란 것을 또 받아야합니다.

 

다시 Account Setting으로 돌아와 API tokens라는 항목으로 이동하여 token을 발행합니다.

 

Token name을 설정하고, Scope에서 Entire account (all projects)를 선택합니다.

 

Create token 버튼을 누르면 화면에 키 값이 표시될텐데요. 패키지를 업로드할 때마다 이 키 값을 가지고 있어야 하므로 잘 기록해 둡니다.

pypi-AbCdEfGhIjKlMnOpQrStUvWxYz...

 

3. 패키지 업로드


먼저 패키지 빌드 및 업로드를 위한 모듈을 설치합니다.

$ pip install sdist twine

 

앞서 작성한 setup.py에 근거하여 빌드를 진행합니다. 작업이 완료되면 dist 디렉토리 안에 압축된 파일이 하나 있을텐데요. 이 압축 파일이 바로 PyPI 저장소에 올라가는 원본 소스 파일이라고 보면 됩니다.

$ python setup.py sdist

 

업로드 명령어는 아래와 같으며, 업로드 중에 패키지 관리자 인증 작업이 진행될 겁니다. 아까 PyPI 계정 생성 단계에서 발급받은 token 정보를 입력하여 인증을 완료하면 패키지가 서버로 전송되는 것을 확인할 수 있습니다.

$ python -m twine upload dist/<빌드 파일명>.tar.gz
  • Enter your username: __token__ (간혹 안 물어볼 때도 있음)
  • Enter your API token: [발급받은 token]

 

PyPI 웹 페이지로 돌아와 계정 클릭 후 Your projects를 선택하면 빌드한 패키지가 나타날 겁니다.

 

패키지 테스트

저장소에 올라간 패키지를 이제 다른 PC에서 설치하고 사용할 수 있는지 테스트해보세요.

$ pip install <패키지명>

 

$ python

>>> import <패키지명>

반응형