Python

[Python] PyPI 패키지 만들기 및 배포

ssun-g 2022. 4. 27. 11:35
직접 만든 패키지를 PyPI에 업로드하면 "pip install" 로 쉽게 다운로드 할 수 있다.

 

  •  규칙
    • 패키지명과 모듈명은 동일하지 않아도 된다.
    • PyPI에서 제시하는 규격대로 패키징해야 한다.
    • PyPI에 등록되어 있는 패키지명과 겹치면 안된다.

 

패키지 폴더 구성

  • 패키지 폴더 안에 setup.py 파일, packageTest 폴더 생성
  • packageTest 폴더(모듈) 안에는 __init__.py, packageTest.py 파일 생성

ssung_package_test (패키지명) / packageTest (모듈명)

 

setup.py

from setuptools import setup

setup(
    name='ssung_package_test', # 패키지 명

    version='0.0.1', # 버전
    
    description='Test Package', # 배포할 패키지에 대한 설명 

    author='ssung', # 배포하는 사람의 이름
    
    author_email='jinsung3325@gmail.com', # 배포하는 사람의 메일 주소
    
    url='https://github.com/ssun-g/python_package_test', # 배포하는 패키지의 url

    license='MIT', # MIT에서 정한 표준 라이센스 따른다
    
    py_modules=['packageTest'], # 패키지에 포함되는 모듈
    
    python_requires='>=3', # 해당 패키지를 사용하기 위해 필요한 파이썬 버전
    
    install_requires=[], # 패키지 사용을 위해 필요한 추가 설치 패키지
    
    packages=['packageTest'] # 패키지가 들어있는 폴더들
)

 

__init__.py

__all__ = ["packageTest"]

 

packageTest.py

def test_package():
    print("This is package test")

 

패키지 빌드

  • 앞서 작성한 패키지를 PyPI에 업로드 가능한 형식으로 패키지 변환 후 업로드
  • 업로드를 위해 먼저 wheel, twine 패키지를 설치한다.
    • wheel : 패키지 빌드 
    • twine : PyPI에 업로드

 

pip install wheel twine

 

다음 명령어로 패키지를 wheel 파일로 빌드한다.

python setup.py bdist_wheel

패키지 빌드

 

build, dist, ssung_package_test.egg-info 폴더가 생성된다.

 

패키지 업로드

패키지를 업로드 하기 위해 먼저 PyPI에 가입해야 함.


 

다음 명령어로 빌드한 패키지(dist/ssung_package_test_0.0.1-py3-none-any.whl)를 PyPI에 업로드 한다.

twine upload dist/ssung_package_test-0.0.1-py3-none-any.whl

 

  • username : PyPI에 가입할 때 설정한 username
  • password : PyPI에 가입할 때 설정한 password

 

패키지 다운로드 및 테스트

다운로드

  • pip install {PACKAGE_NAME}
  • PACKAGE_NAME은 setup.py에서 설정한 name이 된다.
pip install ssung_package_test

배포한 패키지 설치

 

테스트

from packageTest import packageTest

packageTest.test_package()

테스트 결과

 

※ 주의 사항 ※

  • 한 번 배포된 패키지는 동일 버전으로 수정이 불가능하다.
  • 예를 들어, ssung_package_test 0.0.1 버전 업로드 후, 0.0.1 버전은 PyPI에서 삭제는 가능하나 재 업로드는 불가함.
  • 수정하기 위해 버전을 같이 수정해주어야 한다.