Excluding a top-level directory from a setuptools package

Viewed 37082

I'm trying to put a Python project into a tarball using setuptools. The problem is that setuptools doesn't appear to like the way that the source tree was originally setup (not by me, I must add). Everything that I actually want to distribute is in the top-level directory, rather than in a subdirectory like the setuptools docs talk about.

The tree has a directory, tests, that I don't want to have in the released package. However, using exclude_package_data doesn't seem to actually do any excluding, and I'd like to work out what I've done wrong.

My setup.py looks like this, in relevant part:

setup(
  name="project",
  packages=[''],
  include_package_data=True,
  exclude_package_data={'': ['tests']},
  test_suite='nose.collector',
)
7 Answers

I have wasted several hours on the same problem, trying to exclude a module, I finally found that I had to remove the *.egg-info and build directories, that somehow retained the idea that the module had to be included.

We use the following convention to exclude 'tests' from packages.

setup(
   name="project",
   packages=find_packages(exclude=("tests",)),
   include_package_data=True, 
   test_suite='nose.collector',
)

We also use MANIFEST.in to better control what include_package_data=True does.

Ug, setuptools makes this really tricky :(

I don't know if this is what you want, but one project I work on uses a combination of two things:

from setuptools import setup, find_packages
...
packages = find_packages(exclude=['tests']),
data_files = os.walk(path_to_files),

An additional solution that worked in my case. Apparently: packages=setuptools.find_packages(exclude=["tests.*", "tests"]),

didn't work, but:

packages=setuptools.find_packages(exclude=["*tests.*", "*tests"]),

adding the star character at the beginning of the word did the trick.

Related