Is there a standard way to create Debian packages for distributing Python programs?
Solution 1
It looks like stdeb will do what you want.
Also, for installing scripts, I strongly recommend distribute's console_scripts entry point support.
Solution 2
This article by Barry Warsaw helped me in getting quite far through the process. I still had to do a lot of searching on the side, though, and I read most of the Ubuntu packaging guide some time in the past.
Having a good setup.py
is a really good advice. I found these two guides quite good:
Solution 3
There are several libraries out there which abstract away all the necessary steps and let you transform your Python package into a Debian package with a single command.
Assuming your python package already has the setup.py
, in the directory where setup.py
is located, you could use:
-
stdeb (Already mentioned in this answer, install with
pip install stdeb
). To create a Debian package, run:python setup.py --command-packages=stdeb.command bdist_deb
The output
.deb
file will be located in thebdist_deb
directory. -
fpm (install with
gem install --no-ri --no-rdoc fpm
). To create a Debian package, run:fpm -s python -t deb setup.py
-
py2deb (install with
pip install py2deb
). To create a Debian package, run:py2deb -r . .
Each of these libraries has its own caveats, so you might want to try what works best for you.
mac
Updated on April 27, 2021Comments
-
mac about 3 years
There is a ton of information on how to do this, but since "there is more than one way to skin a cat", and all the tutorials/manuals that cover a bit of the process seem to make certain assumptions which are different from other tutorials, I still didn't manage to grasp it.
So far this is what I think I understood.
- My final goal should be that of creating a "binary" .deb package. Such package will be platform-independent (32/64 bit) as all Python programs are such.
- To create a "binary" package I need first to create a source package.
- To create the source package I can use either
CDBS
ordebhelper
. Debhelper is the recommended way for beginners. - The core of creating a source package is populating the
DEBIAN
directory in the source directory with a number of files clarifying where files need to be copied, what copyright and licensing scheme they are subject to, what dependencies they have, etc... - Step #4 can be largely automated the
dh_make
command if the Python source also comes with a distutils'setup.py
script.
Now my questions:
- Is my understanding of the process correct? Is there anything I am missing, or anything that I got wrong?
- Step #5 is really the more confusing to me: specifically the two points that remains most obscure to me are:
-
How do I write a
setup.py
script that install a stand-alone programme? EDIT: By standalone programme I mean a program intended to be used by a desktop user (as opposed to a module which I understand like a collection of functionality to be used by other software after having been imported). In my specific case I would actually need two such "programs": the main software and a separate utility (in effect a second "program" that should be in the same package with the other one). - What are the specificities of such a script for DEB packages? The official documentation only seems to deal with RPM and Windows stuff...
-
How do I write a
BTW: These are the best sources of information that I could find myself so far. If you have anything better than this, please share! :)
- Ubuntu's Python packaging guide
- Creating a .deb package from a python setup.py (it shows the steps, but it doesn't explain them enough for me to follow along)
- ShowMeDo video on "creating a .deb package out of a python program" (it doesn't seem up-to-date and - if I got it right - will produce packages for personal use, without dependencies and without a signed changelog and other key data that will make it incompatible with the Debian policy).