클래스, 모듈 그리고 패키지를 만들고 관리하는 이유는 반복적인 작업을 보다 손쉽게 활용할 수 있도록, 추상화된 함수를 만들고 활용하는 것이 주요 목적 입니다. 클래스와 클래스 상속에 관한 상세한 내용은 파이썬 공식문서 를 참고하면 좋습니다. 한글로도 잘 번역 되어 있습니다.

이번 페이지 내용은 예전에 정리했던 내용을 보완하는 내용으로, 기존에는 개인적인 ID, HASH 데이터를 포함한 모듈을 만들어 활용을 하였습니다. 때문에 1개의 프로젝트에서 활용하는 모듈은 1개로 한정이 되어 큰 부담없이 작업을 진행할 수 있었습니다.

이러한 작업들이 시간에 따라 여러개로 늘어나게 되었고, 패키지 마다 반복되는 내용들이 적지 않은 것과 함께, 관련 모듈들이 업데이트 되면서 수정된 내용을 개별 패키지 마다 모두 수정을 해야만 하는 번거로움이 발생하게 되었습니다. 이로인해 예전에 작업했던것 처럼 배포용 패키지 를 만들고 발간하는 내용 까지 보완을 할 필요가 생겨서 이를 추가한 내용으로 한 번 더 새롭게 정리를 하게 되었습니다.


Package 만들기

Packaging Python Projects 공식문서에 따르면 파이썬 패키지를 생성하는 모듈로는 [build] 와 [setuptools] 2가지가 있습니다. 직접 테스트를 진행해본 결과 비교적 간단하면서도 손쉽게 작업이 가능했던 것은 setuptools 이었습니다. SetupTools Quick Start 를 참고하여 setuptools 를 활용하여 패키지를 제작하는 방법을 알아보도록 하겠습니다.

Installation

작업에 필요한 모듈을 설치 합니다.

$ pip install --upgrade wheel
$ pip install --upgrade build
$ pip install --upgrade setuptools

Structure of Files

작업에 필요한 파일 구조를 살펴보면 다음과 같습니다.

├── 패키지 이름
   ├── __init__.py
   └── data.py
├── pyproject.toml
├── README.md
├── setup.cfg
└── setup.py

pyproject.toml

패키지 설정파일에 속하는 내용으로, 어떤 모듈을 활용할 것인지를 정의 합니다.

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

setup.cfg

https://pypi.org/ 에서 프로젝트 설명 페이지와 연결할 파일을 설정 합니다. 해당 내용이 없어도 될거 같은데 추후 내용을 확인 후 수정하도록 하겠습니다.

[bdist_wheel]
universal = 1

[metadata]
description-file = README.md

setup.py

패키지를 만드는데 핵심이 되는 설정파일 입니다.

파라미터 설명
name 패키지 이름(PYPI에 어떻게 나열될지를 지정)
버전 적절한 의존성 관리를 유지하는 데 중요합니다.
url 패키지 URL. 일반적으로 깃허브(GitHub)
packages 서브 패키지 목록으로 find_packages()가 활용
setup_requires 이곳에 의존성을 지정합니다
test_suite 테스트 시 실행할 도구
with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

from setuptools import setup, find_packages
setup(
    name = '패키지 이름',
    version = '0.0.1',
    license = 'MIT',
    long_description = long_description,
    long_description_content_type = 'text/markdown',
    author = 'creator',
    author_email = '사용자@이메일.주소',
    url = 'https://github.com/오픈소스/Url주소',
    packages = find_packages(),
    python_requires = '>=3',
    keywords = ['패키지 이름'],
    install_requires=[
        '의존성에 의해 필요로 하는 모듈 1',
        '의존성에 의해 필요로 하는 모듈 2',
    ],
    classifiers=[
        'Programming Language :: Python :: 3.9',
        'Programming Language :: Python :: 3.10',
        'Programming Language :: Python :: 3.11',
    ],
)


Building the Package file

python setup.py bdist_wheel 를 실행하면 패키지 내용이 포함된 *.whl 압축파일이 생성 됩니다. 생성된 파일을 활용하여 pip install 로 설치를 하면 활용하실 수 있습니다.

$ python setup.py bdist_wheel
creating build/bdist.linux-x86_64/wheel/패키지이름-0.0.1.dist-info/WHEEL
creating 'dist/패키지이름-0.0.1-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
removing build/bdist.linux-x86_64/wheel


Package 배포하기

https://pypi.org/ 가입하기

파이썬 패키지를 온라인으로 등록하고 배포 및 관리 과정은 https://pypi.org/ 에서 모두 가능합니다. 우선 회원가입이 필요로 하는데 소셜 가입은 할 수 없고, 별도로 관리를 요구하는 아이디와 비밀번호를 설정해야 합니다. 자세한 과정 및 내용은 파이썬 패키지(PYPI) 만들기 및 등록하고 배포하기 를 참고하면 됩니다

패키지 이름 정하기

패키지 이름은 기존에 등록된 이름과 중복되면 안됩니다. 따라서 검색을 통해 내가 등록할 이름과 동일한 패키지가 이미 등록되어 있는지를 확인해야 합니다. 해당 내용이 없으면 다음 과정에서 원활하게 진행이 가능합니다.

패키지 온라인 등록하기

twine 모듈의 도움을 받아 앞에서 작업한 *.whl 파일을 연결하여 실행을 하면 아래의 내용과 동일하게 실행되는 것을 볼 수 있습니다. pypi 사이트에 가입한 사용자 이름과 비밀번호를 입력 하면 터미널에서 온라인 사이트로 모듈을 등록할 수 있습니다. 이때 주의할 점은 기존의 업데이트 버젼 과 동일한 버젼의 이름으로 명령을 실행하면 http 400 오류를 출력 합니다.

$ python3.10 -m twine upload dist/*

Uploading distributions to https://upload.pypi.org/legacy/
Enter your username:
Enter your password: 
Uploading 패키지이름-0.0.1-py2.py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.6/12.6 kB • 00:00 • 11.0 MB/s

View at:
https://pypi.org/project/패키지이름/0.0.1/


Pypi 2FA 인증하기

2023년 말부터 ID, Password 로 패키지 업데이트를 하면 2fa 인증을 요구하면서 진행되지 않았습니다. two-factor authentication 는 사용자계정 인증외에 추가 인증을 요구하는 시스템 입니다. 인증을 완료하면 API Token 값을 발급 받을 수 있습니다. 발급받은 정보를 $HOME/.pypirc 파일에 다음과 같이 저장을 하면 됩니다.

[pypi]
  username = __token__
  password = pypi-`token 발급받은 값 정보`

작업을 완료하고 나서, 기존의 ID, Password 를 입력하는 방법으로 진행을 하면 원활하게 진행됨을 확인 할 수 있었습니다.

2FA 인증 시스템

two-factor authentication 는 사용자 계정의 인증 이외에, 추가 인증을 요구하는 방법 입니다. 인증작업을 진행해본 Token의 발급Token 관리 등과 관련하 내용들은 인증작업을 완료한 기기에서만 볼 수 있었습니다.

진행과정

pypi.com 사이트에서 로그인을 한 뒤, Recovery OTP Code 8개를 발급 받습니다. 8개의 코드 중 1개를 활용하여 다음단계를 진행하면 되고, 저같은 경우에는 스마트폰에서 진행을 했는데 Add 2FA with security device(e.g) USB key 를 선택하였습니다.

갤럭시에서 authentication application 을 선택했을 때에는 Samsung Pay 로 검증단계가 진행 되었는데 보안앱에 따라 Pypi 계정과 연결등의 추가적인 설정 문제를 해결하지 못해서 어려움을 격었습니다. 반면 security device USB 로 진행해본 결과 기기에 관련 정보를 저장하는 것으로 절차가 완료되어 보다 수월하게 진행할 수 있었습니다.


참고사이트