파이썬으로 개발을 하다보면 자주쓰는 모듈들을 다른 프로젝트에 import 하여 사용하거나
더 나아가서 다른 사람들에게 제공을 하기위해 whl파일로 만들고 Python Package Index(PyPI)에 등록을 하여 pip 으로 다운로드 받을 수 있게끔 제공을 할 필요성을 느낄수 있습니다.
이번 포스트에서는 위와 같은 상황을 해결 할수 있는 프로젝트를 패키징하는 방법에 대해서 작성해보겠습니다.
혹시 파이썬의 모듈이나 패키지를 import 하는 개념이 잘 이해가 안되신다면 https://docs.python.org/3/tutorial/modules.html#packages를 참고 하시기 바랍니다.
파이썬에서 나만의 패키지를 만드는 법은 아래와 같습니다.
1. 패키징을 하기위해 기본적인 프로젝트를 생성한다.
/example_pkg
/example_pkg
__init__.py
위는 패키징을 하기 위한 최소한의 모델 구조입니다. __init__.py 파일은 필수적으로 필요하며 다른 .py 파일을 추가하여도 무방합니다.
2. 패키지 파일들을 생성합니다.
/example_pkg
/example_pkg
__init__.py
setup.py
LICENSE
README.md
3. setup.py 파일을 생성합니다.
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="example_pkg",
version="0.0.1",
author="Example Author",
author_email="author@example.com",
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/pypa/sampleproject",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
- “name”은 패키지의 이름입니다. 이미 Pypi.org에 등록되어 있는 이름을 사용하지 않아야합니다.
- “version”은 패키지 버전을 의미합니다.
- “author”와 “author_email”은 패키지의 작성자의 정보를 나타냅니다.(추후 PyPI에 업로드하였을때 표기되고 문의를 받는 메일주소가 됩니다.)
- “description”은 한 문장정도로 설명할 수 있는 패키지의 요약 정보입니다.
- “long_description”은 패키지의 자세한 설명을 작성합니다. PyPI에 보여지며 보통 README.md를 로드합니다.
- “long_description_content_type”은 “long_description”의 타입을 표기합니다. 위 예제의 경우 Markdown을 의미합니다.
- “url”은 프로젝트의 홈페이지 URL을 의미하며 보통 Github를 링크합니다.
- “packages”는 배포 패키지에 포함되어야 하는 Python 패키지를 입력합니다. 수동으로 입력할 수도 있고 find_packages()라는 함수를 이용하여 자동으로 모든 패키지와 서브 패키지를 찾을 수도 있습니다.
- “classifiers”는 패키지에 대한 몇가지 추가적인 메타데이터를 입력합니다.
※ PyPI에 업로드하 게 되면 아래와 같은 화면이 표기가 됩니다.
※ 만약 내가 작성한 패키지에 의존성이 있는 다른 패키지가 있다면 install_requires를 이용하여 의존성을 걸수 있으며 의존성이 걸려있는데 컴퓨터에 해당 패키지가 설치되어있지 않다면 아래와 같은 오류가 발생하게 됩니다.
이때는 requirements.txt 파일을 생성후
python-telegram-bot==11.1
등 의존성이 걸려있는 패키지를 입력을 해두면 다운로드 받는 쪽에서 pip install -r requirements.txt 명령어를 입력하여 requirements.txt에 적혀있는 패키지들을 다운로드 받을 수 있습니다.
의존성이 걸린 패키지가 모두 잘 설치되었다면 아래와 같이 정상적으로 패키지 설치가 진행 됩니다.
4. README.md 파일을 생성합니다.
# Example Package
This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.
5. LICENSE파일을 생성합니다.
Copyright (c) 2018 The Python Packaging Authority
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, 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 THE
SOFTWARE.
6. 배포 아카이브 생성하기
배포 아카이브를 생성하기 위해서는 setuptools와 wheel패키지를 설치하여야 합니다.
설치가 완료되었다면 위에서 생성한 setup.py가 있는 폴더위치로 가서 아래 명령어를 실행합니다.
python3 setup.py bdist_wheel
[명령어 실행 전]
[명령어 실행 후]
7. PyPI에 위에서 패키징한 패키지 업로드하기
패키지를 PyPI에 업로드하기 위해서는 twine 패키지를 설치해야합니다.
twine 패키지를 설치하셨다면 whl파일이 있는곳으로 가서 아래 명령어를 실행합니다.
twine upload 패키지명.whl
명령어를 실행하면 PyPI의 아이디와 비밀번호를 입력하는 창이 뜨며 아이디와 비밀번호를 입력하면 PyPI로 업로드가 됩니다.
출처: https://packaging.python.org/tutorials/packaging-projects/