Home Python Build System
Post
Cancel

Python Build System

Python Project를 build하는 방식에 대한 히스토리와 방법 소개

개요

python project를 build하는 방법에 대해서 찾아보면 여러가지 방법이 나온다.
distutils, setuptools, poetry를 이용한 방법을 찾을 수 있다. 간단히 요약해보면 setup.py를 사용하는 방법은 legacy가 되었고, 현재는 distutils를 사용하는 방법은 legacy이며 python3.12 이후로는 deprecated 예정이다.
권장하는 방법은 pyproject.toml과 을 이용하 방법이 권장된다.
간단한 히스토리와 각각의 방법에 대해 설명하는글을 작성하려고 한다.

setup.py(distutils)

파이썬 최초의 빌드 패키지, 단순히 코드를 패키징하고 빌드만 할수있다. 의존성 관리도 할 수 없는 아주 단순한 도구이다.

1
2
3
4
5
6
from distutils.core import setup
setup(
    name='mypackage',
    version='0.0.1',
    py_modules=['mypackage'], 
)
1
2
python setup.py sdist
python setup.py bdist

setup.py(setuptools)

distutils의 확장판
distutils의 setup.py 포맷을 그대로 따르면서 의존성을 관리할 수 있게 됐고,
easy_install이라는 명령어로 PyPI에 업로드된 패키지를 설치하는 기능까지 제공한다.

추후에 pip가 나오면서 easy_install을 통한 PyPI 패키지 설치는 잘 사용하지 않게 되었다.

1
2
3
4
5
6
7
8
9
10
from setuptools import setup

setup(
    name='mypackage',
    version='0.0.1',
    install_requires=[
        'requests',
        'importlib-metadata; python_version == "3.8"',
    ],
)
1
2
python setup.py sdist
python setup.py bdist_wheel

pyproject.toml

위에서 본 setup.py을 사용하는 방법은 패키지의 메타데이터를 저장하는 setup.py가 setuptools가에 의존적이고 종속적이라는 문제가 있다.
따라서 특정 빌드시스템에 종속적이지 않는 방식이 필요했고 이에 따라 pyproject.toml이 등장하게 됐다.

pyproject.toml에 어떤 빌드시스템을 사용할지 지정할 수 있다. setuptools도 사용할 수 있고, poetry1, flit등 다른 빌드시스템을 사용한다고 선언하기만 하면 된다.

1
2
3
4
5
6
7
8
9
10
11
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "mypackage"
version = "0.0.1"
dependencies = [
    "requests",
    'importlib-metadata; python_version<"3.8"',
]

위의 예시는 build system을 setuptools로 선언한 예시다.

1
python -m build

정리

패키지의 메타데이터를 저장하는 파일이 setup.py(distutils) -> setup.py(setuptools) -> pyproject.toml 순으로 발전해왔고

setup.py의 경우 setuptools에 종속적이였으나, pyproject.toml로 오면서 특정 빌드시스템에 종속적인 문제가 해결됐음을 알 수있다.

오픈소스프로젝트를 보면 아직도 setup.py를 사용하는 프로젝트도 많이보이고 pyproject.toml을 사용하는 프로젝트도 많이 보인다.

위의 히스토리를 간단하게 이해만 하고 있어도 파이썬 패키징에 대해 혼동하지 않고 방향을 잡아갈 수 있다고 생각한다. 위에 나온 방법들로 간단한 프로젝트를 패키징해보면 이해하는데 도움이 될 것이다. 또 최근 poetry라고 하는 툴은 프로젝트 셋업부터 PyPI 업로드까지 전부지원하므로 한번 사용해보는 것을 추천한다.

reference

  1. https://python-poetry.org/ 

This post is licensed under CC BY 4.0 by the author.

PythonProject PyPI에 배포하기

pytest module not found error