목차
평소 github에서 다양한 사람들의 코드를 가져다 사용할 때면 항상 나에게 맞추어 수정해야 하는 불편함이 있었다. 따라서 유용하게 사용하던 utility function 등을 나에게 맞는 코드로 짜두고, 프로젝트에서 라이브러리로 불러올 수 있게 (pip install ... 등으로 설치하여 사용할 수 있게) 특정 프로젝트 폴더를 파이썬 패키지로 만드는 방법을 알아보려 한다.
PyPI (Python Package Index) 개념 및 회원 가입
PyPI는 파이썬의 패키지 저장소 개념이다. 평소 'pip install ...'으로 다운받던 패키지가 보관되는 곳으로 보면 된다.
여기에 나만의 패키지를 만들어 업로드하려면, 우선 회원 가입부터 해야한다.
프로젝트 등록
우선, 겹치는 프로젝트명이 있는지 찾아보자. PyPI 사이트에서 'Search projects'란에 업로드하고자 하는 프로젝트명대로 검색해본 후, 정확히 일치하는 프로젝트 명이 없다면 등록이 가능한 것이다.
프로젝트 폴더 구성
업로드할 프로젝트 폴더의 구조는 다음과 같다.
- 루트(root) 폴더 (프로젝트 폴더명) : 꼭 PyPI에 업로드할 프로젝트의 이름일 필요는 없다.
- 패키지 폴더명
- setup.py : 루트 폴더 하위에 위치해야 하고, 아래와 같은 정보를 담는다.
- name : 프로젝트명 ('pip install [package_name]'에서 package_name에 해당) → 업로드할 때 대소문자를 굳이 구분하지 않기 위해 위 예시에서의 "JJukE"가 아닌 "jjuke"로 변경하여 업로드하였다.
- version : 보통 '[주요기능추가&대규모변경].[작은기능추가].[버그수정]'와 같은데, 정확히 정해진 것은 아니다. 나는 우선 업로드 해둔 후에 자주 수정할 것 같아서 하위에 하나 더 추가하여 '0.0.0.1' 버전으로 명시했다.
- description : 프로젝트 설명
- author : 프로젝트 소유자 (PyPI에 가입할 때의 Username)
- author_email : 프로젝트 소유자의 이메일 주소 (PyPI에 가입할 때의 email)
- url : 프로젝트의 주소(github 주소)
- install_requires : 프로젝트 실행을 위해 사전에 설치할 파이썬 패키지
- keywords : 프로젝트 검색 시 사용되는 키워드
- python_requires : 최소 파이썬 설치 버전 (ex. python_requires='>=3.6')
- entry_points : 프로그램의 시작점 지정
- 위 예시와 같이 업로드할 경우, 'pip install jjuke'로 패키지를 다운로드한 경우, "jjuke.main:main"을 호출하는 "JJukE.py"를 사용자 디렉터리($HOME/.local/bin)에 생성한다.
- 이 때, 같은 프로젝트에 포함된 모듈을 import하는 경우, 명시적으로 상대 경로를 지정해야 한다. 예를 들어, 프로젝트를 실행할 때에는 단순히 'import example'로 같은 경로의 라이브러리(exmple.py파일 등)를 사용할 수 있지만, 패키지를 다운받은 경우에는 site-packages 경로를 기준으로 라이브러리를 찾기 때문에 상대경로로(from .example import *)를 해주어야 하는 것이다.
그리고 패키지의 폴더(jjuke 폴더) 하위에는 __init__.py 파일을 추가해주어야 한다.
__init__.py 파일에는 위와 같이 사용할 모듈들과 버전을 명시해준다. 패키지의 버전을 업데이트 할 때에는 setup.py에서 기입했던 버전과 __init__.py의 버전을 모두 업데이트해야 한다.
패키지 빌드 및 업로드
패키지를 빌드하고 업로드하기 위해 다음 명령어로 setuptools와 wheel을 설치한다.
pip install setuptools wheel
# 또는 아나콘다 가상환경에서
conda install -c conda-forge setuptools wheel -y
setup.py 파일이 위치한 경로에서 다음 명령어를 실행하면 파이썬 패키지가 생성 및 빌드된다.
python setup.py sdist bdist_wheel
빌드 후에는 위와 같이 build, dist, egg-info와 같은 폴더가 생성된다. (이후 버전을 업로드 할 때에는 setup.py의 version을 수정하고, build, dist, egg-info 폴더를 삭제해주도록 한다.)
이제, 만든 패키지를 업로드하기위해 twine 패키지를 사용한다. 먼저, twine 패키지를 다운받고,
pip install twine
아래 명령어로 패키지를 업로드한다.
python -m twine upload dist/*
PyPI의 Username과 Password를 입력하면 업로드가 완료된다.
최근댓글