ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 패키지 만들어서 Pypi에 배포하기 (+ README.md 홈 화면에 띄우기)
    Tips 2022. 7. 25. 23:57
    728x90
    반응형

     

     DA분들 중에 Python을 사용하여 분석을하고자 하시는데 Redshift에서 데이터를 바로 불러오시지 못해 번거로운 과정을 거치고 계시는 걸 알게 되었다. Psycopgy2나 Boto3와 같은 라이브러리를 사용하시면 되지만 이런 필요성이 생길 때마다 여러 줄의 코드를 알려드리고 동작 방법에 대해서 설명드리기보다는 차라리 메소드 하나로 바로 Pandas frame으로 불러올 수 있는 패키지를 만드는 것이 빠르겠다는 판단이 들어 Python 패키지를 만들어 pypi에 배포했다.

     (처음에는 Pypi에 배포하지 않고 사내에만 공유하여 모듈 내부에 DB user 인증정보까지 넣어서 좀 더 간단하게 쓰실 수 있게 하려고 했는데 확장성을 위해 내부 회의 후 Pypi에 배포하고 계정 정보는 제외하는 것으로 결정했다.)

     

    회원가입하기

     먼저 Pypi에 배포하려면 Pypi 계정이 있어야하니 홈페이지에서 우측 상단의 Register버튼을 눌러 회원가입을 한다. (Username과 Password는 후에 배포시 필요하므로 잊어버리지 않는 것으로 가입한다).

     

    작업폴더 구성

    이 후 다음과 같이 작업 폴더를 구성한다.

    •  [패키지 이름] : 디렉토리여도 되고 파일이어도 된다. 내가 만든 파일의 경우 red2df라는 디렉토리를 만들었고 그 안에 __init__.py를 넣어 해당 파일안에 배포하고자하는 클래스를 작성해주었다.
    • __init__.py: 패키지 파일이 무엇인지 알려주는 파일이다 (위의 __init__.py와 다른 파일이다). 다음과 같이 작성해준다.
    __all__ = ['패키지가 담겨있는 디렉토리 또는 파일명']
    • LICENSE.txt: 라이센스 파일이다. 라이센스 종류에는 여러가지가 있는데 뭘 선택하든 크게 상관은 없는 듯 하다. Github에 레포지토리를 만들었다면 그 과정에서 자동으로 라이센스 파일을 만들 수도 있다. 아니면 다음 파일에서 빨간색 부분을 수정해서 만들어도 무관하다 (MIT 라이센스이다).

    Copyright (c) 2022 [패키지 소유자 이름]

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:


    The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.
    • setup.py: 패키지 파일의 메타데이터이다. 여러가지 항목이 있는데 필수 항목인 것도 있고 아닌 것도 있으니 공식문서를 참조하면 좋다. 나는 다음 항목들을 입력했다 (코드 참고)
      • name: 패키지 이름
      • version: 패키지 버전. 버전은 구글에 버저닝 규칙을 검색해서 참고하면 도움이 된다.
      • packages: 배포할 패키지가 들어있는 폴더들
      • description: 해당 패키지에 대한 짧은 설명으로 패키지 레포지토리의 상단에 표시된다.
      • long_description: 해당 패키지에 대한 긴 설명으로 패키지 레포지토리의 메인 화면에 표시된다. Readme 파일을 넣으려면 open을 활용해 코드를 짜야한다 (코드 참고)
      • long_description_content_type: long_description의 타입
      • author: 패키지 작성자. 패키지 레포지토리에 표시된다.
      • author_email: 패키지 작성자의 이메일. 역시 패키지 레포지토리에 표시된다.
      • url: 패키지 소스코드가 담겨있는 url (보통 github url 사용)
      • license: 라이센스 타입
      • python_requires: 해당 패키지를 사용하기 위해 python버전이 특정 버전이어야한다면 명시해준다.
      • install_requires: 해당 패키지를 사용하기 위해 함께 설치되어야하는 pypi 라이브러리를 작성해준다. 해당 패키지를 설치할 때 자동으로 함께 설치된다.

     최종 구성된 패키지는 다음과 같다. setup.cfg와 README.md 파일은 필수 파일은 아니므로 설명에서 제외한다. 혹시 넣고 싶은 분들은 위의 코드 링크에 들어가서 복붙해도 된다.

    빌드 및 배포하기

     패키지 파일이 완성되었다면 빌드 및 배포를 위해 wheel과 twine을 설치해준다.

    $pip install setuptools wheel && pip install twine

     wheel과 twine이 설치되었다면 다음 명령어로 빌드를 하면 작업 디렉토리 네에 .egg파일과 dist파일이 생성된다. 이후 패키지를 수정후 재배포 하려면 해당 디렉토리들을 삭제한 후 다시 빌드하여 재배포 해야한다.

    $python setup.py sdist bdist_wheel

     .egg와 dist파일이 생성되었다면 다음 명령어를 통해 빌드를 수행한다.

    $twine upload dist/*

     

     위 명령어를 수행하면 pypi링크와 함께 username과 password를 입력하라는 메세지가 뜬다. 올바르게 입력하면 배포가 잘 수행되고, https://pypi.org/project/{패키지이름}으로 구성된 패키지 레포지토리 링크가 생성된다.

    728x90
    반응형

    댓글