본문 바로가기

프로그래밍언어/Python

[Python] 프로젝트 패키징 & 배포

반응형

패키징이란?

 

패키징이란 모듈별로 생성한 실행 파일들을 하나로 합쳐서 배포 및 설치가 가능한 파일을 만드는 것이다.

파일을 패키징하는 이유는 다른 환경에 소프트웨어를 배포하기 위함이기에 다음과 같은 질문에 대해서 고려하여 패키징을 진행해야한다.

 

  - 소프트웨어를 사용할 사람이 누가 될 것인가? 패키징한 소프트웨어를 누가 설치할 것인가?

  - 소프트웨어가 어떤 환경에 배포되고 실행될 것인가? (서버, 데스크탑, 모바일 등등)

  - 소프트웨어는 독립적으로 설치가 될 것인가, 아니면 다른 배포 시스템에 연계되어서 설치될 것인가?

 

패키징한 파일을 배포할 환경에 대한 다양한 요인들에 대해서 고려해서 패키징을 진행해야한다.

Python packaging

1. metadata 설정

1-1. setup.py 설정

setup.py는 root 디렉토리에 생성하는 파일로 패키지의 대부분의 빌드 설정을 setup.py 파일을 통해서 한다. setup.py에서는 setuptools를 위한 빌드 스크립트로서 패키지의 이름과 버전 등의 정보를 비롯해서 어떤 소스들이 포함되야하는지를 알려준다. setup() 함수를 통해서 해당 정보들을 제공해주고, cli를 통해 다양한 옵션을 사용할 수 있다.

 

import setuptools

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

setuptools.setup(
    name="example-pkg-YOUR-USERNAME-HERE", # Replace with your own username
    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",
    project_urls={
        "Bug Tracker": "https://github.com/pypa/sampleproject/issues",
    },
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    package_dir={"": "src"},
    packages=setuptools.find_packages(where="src"),
    python_requires=">=3.6",
)

 

 

setup 의 매개변수

 

이름 설명
name 패키지 배포 파일의 이름 (프로젝트 이름)
version 패키지 배포 버전
author 프로젝트 저자
author_email 저자 이메일
description 프로젝트 설명
long_description 프로젝트에 대한 자세한 설명으로 이 예제에서는 "README.md" 파일을 읽어와서 사용하고 있다.
long_description_content_type long_description의 타입에 대한 설명으로 이 예제에서는 markdown을 사용하고 있다.
url 프로젝트의 홈페이지 주소로 예제에서는 GitHub 주소를 사용하고 있다.
project_urls 기타 프로젝트 관련 페이지의 주소 리스트이다. 주로 documentation이나 issue tracker 페이지 등이 포함된다.
classfiers PYPI에 등록될 meta data 설정이다.
예제의 경우 Python 3, MIT license, OS independent 등을 설정해놓았다.
하지만 이는 PYPI에 등록될 meta data들이고 실제 빌드에는 영향을 끼치지 않는다.
package_dir 패키지 디렉토리 정보 dict 타입으로 저장한 정보이다.
패키지 이름이 key, 패키지 디렉토리가 value로 사용된다.
패키지 이름을 빈 값으로 주는 경우는 root 패키지를 뜻한다.
예제의 경우 src 디렉토리가 root 패키지가 된다.
packages 배포 패키지에 포함될 파이썬 패키지의 리스트를 설정해주는 인자이다.
이 예제의 경우 find_packages() 함수를 사용하여 package 디렉토리 아래에 있는 모든 패키지들을 포함하도록 했다.
python_requires 프로젝트에서 지원하는 파이썬 버전에 대한 정보이다.

1-2. setup.cfg

setup.py에 대한 기본값 등을 옵션으로 설정할수 있는 파일이다.

 

2. README.md, LICENSE.txt 등 작성

예제에서 long_description으로 README.md 파일을 사용하기 때문에 프로젝트에 대한 정보를 담은 README.md 파일이 필요하다. 또한 PYPI에 배포파일을 업로드하려고 한다면 해당 소프트웨어에 대한 라이센스를 추가해줘야 한다.

 

3. 빌드하기

setup.py 파일을 이용해서 파이썬 프로젝트를 빌드할 때 다양한 옵션으로 빌드를 진행할 수 있다.

 

python setup.py sdist

source distribution을 생성한다. source distribution은 metadata와 필수 소스들을 제공해주는 포맷으로 pip로 설치를 하기 위해서는 build 단계를 거쳐야한다.

 

python setup.py bdist_wheel --universal

pure python으로 구성되어 있고 python 2와 3 모두를 지원하는 wheel 파일로 빌드한다. 빌드된 파일은 universal wheel 이라고 한다.

 

python setup.py bdist_wheel

pure python wheel 또는 platform wheel을 생성할때 사용한다. pure python wheel은 pure python으로 구성되어 있고 python 2와 3 모두를 지원하지는 않는 형식이다. platform wheel은 컴파일된 extensions를 포함하고 있어서 특정 os에 대한 wheel 파일을 의미한다.

빌드하게 되면 dist 디렉토리 아래에 whl 파일이 생성되게 된다.

 

※ wheel이란?

wheel은 파이썬의 build package로 일반적인 source distribution보다 더 빠른 설치가 가능하여서 공식적으로 권장되는 포맷이다.

'.whl' 확장자를 사용한다.

4. 배포하기

twine 패키지를 사용하여서 PYPI에 배포할 수 있다. 'python setup.py upload'를 사용하지 않는 이유는 http를 사용해서 배포하기 때문엗 아이디나 패스워드가 노출될 수 있는데 반면 twine은 TLS를 사용하기 때문이다.

 

twine upload dist/example-pkg-YOUR-USERNAME-HERE.whl

 

twine를 통해서 dist 디렉토리 아래의 whl 파일을 배포한다.

5. 설치하기

pip install을 사용해서 배포한 패키지를 설치할 수 있다.

 

pip install example-pkg-YOUR-USERNAME-HERE

 

 

[reference]

- An Overview of Packaging for Python

 

An Overview of Packaging for Python — Python Packaging User Guide

An Overview of Packaging for Python As a general-purpose programming language, Python is designed to be used in many ways. You can build web sites or industrial robots or a game for your friends to play, and much more, all using the same core technology. P

packaging.python.org

- Packaging Python Projects

 

Packaging Python Projects — Python Packaging User Guide

setup.cfg is the configuration file for setuptools. It tells setuptools about your package (such as the name and version) as well as which code files to include. Eventually much of this configuration may be able to move to pyproject.toml. Open setup.cfg an

packaging.python.org

- Packaging and distributing projects

 

Packaging and distributing projects — Python Packaging User Guide

Packaging and distributing projects This section covers some additional details on configuring, packaging and distributing Python projects with setuptools that aren’t covered by the introductory tutorial in Packaging Python Projects. It still assumes tha

packaging.python.org

- 파이썬 package 배포 하기

 

파이썬 package 배포 하기 - Blog by Eun Woo Song

Python은 가장 널리 쓰이는 언어중 하나고 오픈소스 라이브러리도 너무나 많으므로 당연히 오픈소스 배포과정이 쉽게 정리가 잘되어있을을것 같지만 의외로 헛갈리는 점들이 몇가지 있다. 알고

rampart81.github.io

 

반응형