Is it possible to exclude data file sources and intermediary files from bdist?

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
                ├── __init__.py
                ├── 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(
    package_data={'thing': ['data/*.bin']},
    exclude_package_data={'thing': ['data/*.src']},
    include_package_data=True,
    #
    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

Leave a Comment