PyPI(Python Package Index)
Python 패키지와 모듈을 공유하고 설치할 수 있는 공식 저장소
Python 개발자들이 패키지를 배포하고, 다른 개발자들이 쉽게 설치하고 사용할 수 있도록 돕는 플랫폼
2024년 12월 28일 12시 17시 기준
596099개의 프로젝트가 존재
패키지 배포
• 개발자는 자신이 만든 패키지를 PyPI에 업로드하여 다른 사람들이 사용할 수 있게 공유
• 표준 Python 라이브러리 외에 추가적인 기능을 제공하는 패키지가 수천 개 이상 등록되어 있음
pip 통합
• PyPI에 등록된 패키지는 pip(Python의 패키지 관리자)를 사용해 간단히 설치 가능:
pip install 패키지명
무료 사용
• 오픈소스 프로젝트나 상업용 프로젝트를 무료로 배포
패키지 관리
• 버전 관리, 의존성 명시, 설치 스크립트 등을 통해 사용자가 안정적으로 패키지를 설치하도록 돕는 시스템
PyPI에서 사용하는 주요 기술
setup.py 파일
•Python 패키징 표준 PEP 517에 따라 도입
• 패키지를 배포하기 위해 필요한 메타데이터와 설정을 정의하는 Python 스크립트 (전통적인 설정 파일)
• setuptools 또는 distutils와 같은 도구에서 읽어들여 메타데이터 처리
=>패키지 이름, 버전, 저자, 의존성 등 기본 메타데이터 정의 + 빌드 및 설치 프로세스 커스터마이징 스트립트 작성
from setuptools import setup, find_packages
setup(
name='mypackage',
version='1.0.0',
author='Choi Subin',
author_email='example@email.com',
description='This is my first PyPI package.',
packages=find_packages(),
install_requires=[
'numpy>=1.19.0',
'pandas>=1.0.0'
],
)
설정 정보와 스크립트 로직이 혼재
pyproject.toml
•Python 패키징 표준 PEP 518에 따라 비교적 현대에 도입된 설정 파일
•빌드 시스템, 메타데이터, 의존성을 정의하는 단일 진입점 역할
•빌드 도구(setuptools, poetry, flit등)의 설정 정보 정의
•최근에는 패키지 메타데이터를 설정하는 데 많이 사용하는 파일(간결, 명확)
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[tool.setuptools]
name = "my_project"
version = "0.1.0"
description = "An example Python project"
author = "Choi Subin"
author-email = "choi@example.com"
[tool.setuptools.dependencies]
numpy = ">=1.21.0"
pandas = ">=1.3.0"
TOML은 JSON과 유사 => 간결한 문법을 제공, 설정 정보를 쉽게 읽고 작성 가능
설정/로직을 분리하여 유지보수성 높임
Poetry, Flit 같은 최신 패키징 도구와 잘 통합됨
setup.py를 사용하는 경우
• 전통적인 setuptools 방식으로 패키징하고 싶을 때
• 빌드 과정에서 복잡한 스크립트를 작성해야 할 때
• 기존의 오래된 프로젝트와 호환성을 유지하려는 경우
pyproject.toml을 사용하는 경우
• 최신 Python 프로젝트에서 PEP 518 표준을 따르고 싶을 때
• Poetry, Flit 같은 최신 빌드 도구를 사용하고 싶을 때
• 설정과 빌드 로직을 명확히 분리하고 싶을 때
혼합 사용 코드
pyproject.toml - 빌드 시스템, 기본 설정 정의:
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
setup.py - 추가 메타데이터, 스크립트 제공:
from setuptools import setup
setup(
name="my_project",
version="0.1.0",
description="An example project",
packages=["my_project"],
)
패키지 업로드
• twine 도구를 사용해 패키지를 PyPI에 업로드
twine upload dist/*
PyPI에서 패키지 배포 과정
1. 패키지 생성
• 필요한 Python 코드를 작성하고 setup.py 또는 pyproject.toml로 패키지 정보를 정의
2. 패키지 빌드
• setuptools와 wheel을 사용해 배포 가능한 파일 생성
python setup.py sdist bdist_wheel
3. PyPI 계정 생성
• PyPI 웹사이트에서 계정 생성
4. 패키지 업로드
• twine을 사용해 PyPI에 업로드
twine upload dist/*
5. 설치 확인
• 배포된 패키지를 pip install로 설치하고 테스트
안전한 업로드를 위해
1. 테스트 환경에서 먼저 확인
패키지를 업로드하기 전에 테스트 환경을 사용해 문제 확인
2. README 파일 작성
• PyPI 페이지에 표시될 설명문서를 작성하여 사용자들이 라이브러리를 이해할 수 있게 해야 함
3. 버전 관리
• 업로드할 때 버전을 명확히 관리해야 함
예: 1.0.0, 1.0.1 등
4. 코드 스캔
• 업로드 전에 코드에 민감한 정보(API 키, 비밀번호 등)가 포함되지 않도록 점검
PyPI에 업로드하기 위한 조건
기본 요건
•고유한 라이브러리 이름
•정상적인 기능(실제 라이브러리 정상 작동, 설정 파일 + 패키지 구조 문제없이 작성)
•패키징 규칙 준수(올바르게 구성된 메타데이터 필요, 패키지 구조가 깨지거나 불완전하면 업로드 실패)
불법적이거나 문제 있는 라이브러리 업로드 금지
• 악성코드(Malware) 포함: 사용자의 시스템에 피해를 주는 악성코드가 포함된 라이브러리
• 허위 정보: 이름만 유명한 라이브러리를 따라하거나, 의도적으로 사용자를 속이는 패키지(numppy 같은 혼란을 주는 이름)
• 저작권 침해: 다른 사람의 코드를 허락 없이 사용하거나 라이센스를 위반한 경우
• 스팸성 패키지: 아무런 유용성이 없는 패키지
PyPI 패키지 관리자의 책임
유지보수
업로드한 라이브러리는 관리자의 책임 아래 유지보수되어야 함
• 버그 수정, 보안 패치, 새로운 버전 업데이트 등이 필요
명확한 설명
• 패키지의 목적, 설치 방법, 사용 예제를 PyPI 페이지에 명확히 작성해야 함
올바른 라이선스
• 코드에 적절한 오픈소스 라이선스를 명시해야 함
• 일반적으로 MIT, Apache 2.0, GPL 같은 라이선스가 많이 사용됨
PyPI 관리 및 규제
PyPI는 업로드된 패키지를 정기적으로 모니터링하고, 문제가 발견될 경우 패키지를 삭제하거나 계정을 차단
자동화된 보안 검사
• PyPI는 Sonatype OSS Index와 같은 도구를 활용해 패키지를 스캔하고, 악성코드나 의심스러운 동작을 탐지
신고 시스템
• 사용자는 PyPI에서 문제 있는 패키지를 발견했을 때 신고하고, 신고가 접수되면 PyPI 관리자 팀이 검토 후 조치를 취함
PyPI 활용
• 오픈소스 배포: 자신의 프로젝트를 공개하여 다른 개발자들이 활용하도록 지원
• 내부 패키지 관리: 회사 내부 도구를 배포하고 관리
• 실험적 패키지 업로드: 새로운 기능을 추가한 라이브러리를 테스트할 목적으로 배포
PyPI에 대한 참고 자료
'Z.PROJ' 카테고리의 다른 글
Docker (0) | 2024.12.24 |
---|---|
Virtual Machines(VMs) / Containers (2) | 2024.12.15 |