Python Packaging
================
.. contents::
`The authoritative docs `_.
Example setup.py::
# Always prefer setuptools over distutils
from setuptools import setup, find_packages
# To use a consistent encoding
from codecs import open
from os import path
here = path.abspath(path.dirname(__file__))
setup(
name='ursonos',
version='0.0.1',
packages=find_packages(),
url='',
license='',
author='poirier',
author_email='dan@poirier.us',
description='Urwid application to control Sonos',
install_requires=[
'soco',
'urwid'
]
)
To include non-Python files in the packaging, create a
`MANIFEST.in file `_.
Example::
include path/to/*.conf
adds the files matching ``path/to/*.conf``. Another::
recursive-include subdir/path *.txt *.rst
adds all files matching ``*.txt`` or ``*.rst`` that are anywhere
under subdir/path. Finally::
prune examples/sample?/build
should be obvious.
Source package
--------------
To build a source package::
python setup.py sdist
Wheels
------
To build a Universal Wheel:
::
python setup.py bdist_wheel --universal
You can also permanently set the ``--universal`` flag in "setup.cfg" (e.g., see
`sampleproject/setup.cfg
`_)
::
[bdist_wheel]
universal=1
Only use the ``--universal`` setting, if:
1. Your project runs on Python 2 and 3 with no changes (i.e. it does not
require 2to3).
2. Your project does not have any C extensions.
Upload
------
The docs recommend ``twine``
::
twine upload dist/*
Projects with code under a ``src`` directory
--------------------------------------------
In this case, there's a Django app ``pkgname`` under src, with a ``templates``
directory and a ``static`` directory that need to be included.
Setup.py::
from setuptools import setup, find_packages
setup(
name="pkgname",
version="1.9.13",
packages=find_packages(where="src"),
package_dir={"": "src", "pkgname": "src/pkgname"},
url="",
license="",
author="poirier",
author_email="",
description="",
python_requires=">=3.6",
install_requires=["Django<=3.0", "dj-database-url", "gunicorn", "whitenoise"],
entry_points={"console_scripts": ["manage=manage:main"]},
package_data={
"pkgname": ["templates/*.html", "templates/include/*.html", "static/*"],
}
)
and MANIFEST.in::
graft pkgname/templates
graft pkgname/static