pythonpackagingsetup.pydebpython-poetry

How to create a deb package for a python project without setup.py


Any documentation I've found about this topic mentions that the "only" requirement to build a deb package is to have a correct setup.py (and requirements.txt). For instance in dh-virtualenv tutorial, stdeb documentation and the Debian's library style guide for python.

But nowadays new (amazing) tools like poetry allow to develop (and upload to PyPI) python projects without any setup.py (this file and several others including requirements.txt are all replaced by pyproject.toml). I believe flit allows this too.

I have developed a python project managed by poetry and would like to package it for Ubuntu/Debian. I guess, as a workaround I can still write a setup.py file that would take its values from pyproject.toml and a requirements.txt file (written by hand using values from poetry.lock).

But, is there a way to do this without any setup.py file?


Solution

  • setuptools, and the setup.py file that it requires, has been the de-facto packaging standard in python for the longest time. The new package managers you mention were enabled by the introduction of PEP 517 and PEP 518 (or read this for a high-level description on the topic), which provide a standardized way of specifying the build backend without the need of a setup.py (and the ensuing hen-egg problem where you already need setuptools to correctly parse it, but might also need to specify which version of setuptools you want for the build).

    Anyway, it's all still very fresh, and the linux packaging community hasn't fully caught up yet. I found this discussion on the debian bug tracker, and the rpm side sums it up neatly over here.

    The short answer is to just wait a while until the toolchain catches up to the new standards, and google debian packaging pep517 support every now and then.


    As a workaround for poetry-build packages specifically, you can use dephell to generate the setup.py, and poetry to generate the requirements.txt for you to keep using legacy tools:

    dephell deps convert --from=poetry --to=setuppy
    poetry export -f requirements.txt -o requirements.txt
    

    And, during the build, tell your pyproject.tom that you plan to use setuptools for the build instead of poetry:

    [build-system]
    requires = ["setuptools >= 40.6.0", "wheel"]
    build-backend = "setuptools.build_meta"