Python package data

Further down is a minimal example showing how to achieve both:

  • packaging a data file file.src in sdist only;

  • and packaging another data file file.bin in bdist only;

  • additionally it shows how file.all is packaged in both distribution packages and file.not in none of them.

The gist of it is:

  • first and foremost, always thoroughly clean up the working directory between two packaging attempts while tweaking these packaging options (in particular empty the src/Thing.egg-info directory containing the SOURCES.txt file as well as the build, and dist directories) or the results will be inconsistent;

  • set the include_package_data option to True;

  • file.all and files that belong in both sdist and bdist are specified in MANIFEST.in;

  • file.bin and files that belong in bdist only are specified in package_data;

  • file.src and files that belong in sdist only are specified in both MANIFEST.in and exclude_package_data;

  • file.not and files that do not belong in any distribution package are not specified anywhere.

The directory structure for our example:

.
├ MANIFEST.in
├ setup.py
└ src
    └ thing
        ├ __init__.py
        └ data
            ├ file.all
            ├ file.bin
            ├ file.not
            └ file.src

In MANIFEST.in:

recursive-include src/thing *.all
recursive-include src/thing *.src

In setup.py:

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    exclude_package_data={'thing': ['data/*.src']},
    include_package_data=True,
    package_data={'thing': ['data/*.bin']},
    #
    name='Thing',
    version='1.0.0',
    #
    package_dir={'': 'src'},
    packages=setuptools.find_packages(where='src'),
)

This has been tested with:

  • Python 3.6.7

  • setuptools 39.0.1

  • wheel 0.33.1