파이썬

파이썬) 모듈 개발부터 배포까지

이소금 2021. 9. 15. 19:12
반응형

사내 배포용으로 라이브러리를 하나 만들었습니다.

 

개발한 모듈을 어떻게 효과적으로 배포할까 고민하다 이참에 pypi에 등록해서 배포해보자 라는 생각으로 시작했습니다.

같은 문제로 또 시간 허비하지 않기 위해 기록으로 남겨둡니다.

처음 해보시는 분들을 위해 아주 자세하게 기록하겠습니다 잘 따라오세요 @_@

 

1. pipy 사이트 가입

로그인 하실 때 이런 화면을 보실텐데요, 이후에 모듈 업로드 시 이메일이 아닌 username과 password를 기입해야 하니 username 잘 기억해 두시기 바랍니다!

로그인 하신 뒤 잠시 대기하겠습니다.

 

2. 프로젝트 생성

PIPY에 맞는 파일 트리로 구성해 줄겁니다. 예를 들어 아래와 같은 모듈이 있다고 가정 해보겠습니다.

해당 모듈 내용은 아무래도 상관 없습니다. 클래스 형식이어도 되고, 함수 형식이어도 됩니다. 어떤 형식으로든 다른 파일에서 import 해 올 수 있는 형식이면 아무래도 좋습니다.

일단 배포하는 것에 집중하겠습니다. 저 모듈 안은 aa 빼고 다 비어있습니다.

aa만 테스트용으로 함수 하나 define 해두겠습니다.

이 구성한 모듈을 새로운 폴더에 담아줄 겁니다. 이 폴더의 이름은 나중에 라이브러리 import 시 사용될 이름이니 패키지 이름으로 동일하게 구성해주세요.

** 패키지 이름 정하실 때에 꼭 pipy에 검색 해보시고 진행하시는걸 추천드립니다. pipy는 패키지 이름 중복을 허용하지 않습니다.

 

해당 폴더 이름을 생성할 떄에 하이픈이나 언더바는 최대한 생략하고, 소문자 단어로 입력해 주세요.

해당 폴더 이름에 저런 특수문자가 들어갈 경우, 이후 파이썬에서 import 시 정상적으로 import가 안되게 됩니다.

저 폴더 안에 두개의 파이썬 파일을 만들어 줄겁니다. __init__.py와 __version__.py요.

그리고 root 디렉토리에 또 파일을 세개 만들어 줄겁니다. setup.py, setup.cfg, README.md 파일 세개요.

여기까지 잘 따라 오셨나요? 그럼 이제 이 파일을 하나씩 채워나갈 겁니다.

1. setup.py

해당 코드 복사 후 setup.py 파일에 붙여넣기 하고 ## 있는 곳 수정해주세요.

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="PUT YOUR PACKAGE NAME", ## 소문자 영단어
    version="0.0.1", ##
    author="PUT YOUR NAME", ## ex) Sunkyeong Lee
    author_email="PUT YOUR EMAIL ADDRESS", ##
    description="PUT THE PACKAGE DESCRIPTION", ##
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="PUT YOUR GITHUB REPO LINK", ##
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

여기서 version에 무엇을 넣을 지 고민하시게 될 겁니다. version이 있는 이유는 다음과 같습니다.

https://pypi.org/help/

pipy는 같은 이름의 패키지를 허용하지 않습니다. 그렇지만 이후 해당 패키지 업데이트가 있을 때마다 이름을 변경할 수는 없기 때문에 매 업데이트 시마다 version을 추가하여 관리하고 있습니다.

처음 기본값은 저대로 맞춰주시되, 이후 업데이트 시 저 버전을 0.0.2 혹은 0.0.0.1 등으로 늘려나가 주시면 되겠습니다.

 

2. setup.cfg

해당 코드 복붙해주세요.

[metadata]
description-file = README.md

 

3. README.md

간략하게나마 해당 패키지에 대한 설명을 넣어주세요.

setup.cfg 파일이 해당 readme 파일을 연동하여 pipy 패키지에도 동일하게 보여질 수 있는 역할을 하게 됩니다.

 

4. __init__.py

아래 코드 복붙해주신 뒤 이후 가져다 쓸 모듈을 여기에 임포트 시켜줍니다.

해당 파일은 모듈을 명시해주는 역할을 합니다.

from 앞의 .이 있어야 제대로 import가 가능하기 때문에 . 꼭 같이 넣어주셔야 합니다. 

from .__version__ import __version__

from .aa import *
from .bb import *
from .cc import *

 

5. __version__.py

위에서 명시해준 버전 그대로 맞춰서 넣어줍니다. 버전 업데이트 시에 해당 파일의 버전도 같이 업그레이드 되어야 합니다.

__version__ = "0.0.1"

 

여기까지 잘 따라 오셨나요? 그럼 이제부터 필요한 패키지들 설치 후 pipy에 업로드 하겠습니다.

pipy에 업로드 하기 전에 지금까지의 환경을 Git Repo에 연동해 두셔야 합니다.

 

패키지 설치 시 저는 Git bash 환경에서 진행했습니다.

setuptools와 wheel 모듈을 설치합니다. 이미 설치되어 있으면 패스하셔도 좋습니다.

$ pip install setuptools wheel

해당 커맨드 날려주는 위치는 setup.py 파일이 있는 root 디렉토리입니다 (중요).

패키지 설치 하셨으면 아래 커맨드 날려주세요.

$ python setup.py sdist bdist_wheel

실행이 성공적으로 되면 디렉토리에 새로운 파일들이 생기게 됩니다.

이어서 바로 pipy에 업로드 하겠습니다. 파일 업로드는 twine 모듈을 사용합니다. 해당 패키지가 이미 설치되어 있으면 생략하셔도 무방합니다.

$ pip install twine

패키지 설치하면 다음 커맨드를 날려줍니다. 해당 커맨드는 dist 디렉터리 내의 파일을 업로드 합니다.

$ python -m twine upload dist/*

해당 커맨드를 날려주시면 아까 회원가입 때 설정한 username과 password를 입력하시면 됩니다.

이렇게 보이시면 pipy에 잘 올라간 겁니다. 확인해 볼까요?

잘 업로드 된 것 확인할 수 있습니다!

 

그럼 올린 파일이 작동이 잘 되는지 확인해봐야겠죠? 방금 올린 따끈한 패키지 설치해봅시다. 

잘 설치가 되었군요! 그럼 또 실물을 구경하지 않을 수 없습니다. 라이브러리로 가보겠습니다.

꺅 여기 있군요!!

설치한 패키지를 사용하려고 하는데 찾을수가 없답니다. 왜 이러는 걸까요?

그 이유는 설치한 패키지가 환경변수 설정이 안되어 있기 때문입니다.

해당 패키지를 전역에서 사용할 수 있도록 위 링크를 환경변수 PATH에 복붙해주신 후 재부팅 해주시면 됩니다.

재부팅 한번 하고 다시 오면 잘 import 되어있는걸 확인하실 수 있습니다.

aa.py에서 정의한 함수 한번 불러볼까요

잘 뜨는군요.

혹시나 재부팅을 하고 왔는데도 import가 안돼요 하시는 분들은 좌측 하단의 python 버전이 설치한 라이브러리가 있는 버전인지 확인해보세요!

글 작성 후 관련 패키지 및 repo는 모두 삭제하였습니다.

 

그럼 모두 해피코딩 하세요~!!!!!!!!!

반응형