setup.py sdist exclude packages in subdirectory

find_packages("src", exclude=["test"]) works.
The trick is to remove stale files such as core.egg-info directory. In your case you need to remove src/core.egg-info.

Here's setup.py I've used:

from setuptools import setup, find_packages

setup(name='core',
      version='0.1',
      package_dir={'':'src'},
      packages=find_packages("src", exclude=["test"]), # <- test is excluded
      ####packages=find_packages("src"), # <- test is included
      author='J.R. Hacker',
      author_email='[email protected]',
      url='http://stackoverflow.com/q/26545668/4279',
      package_data={'core': ['config/*.tmpl']},
)

To create distributives, run:

$ python setup.py sdist bdist bdist_wheel

To enable the latter command, run: pip install wheel.

I've inspected created files. They do not contain test but contain core/__init__.py, core/config/log.tmpl files.


In your MANIFEST.in at project root, add

prune src/test/

then build package with python setup.py sdist


I probably just use wild cards as defined in the find_packages documentation. *test* or *tests* is something I tend to use as we save only test filenames with the word test. Simple and easy ^-^.

setup(name='core',
  version=version,  
  package_dir = {'': 'src'}, # Our packages live under src but src is not a package itself
  packages = find_packages("src", exclude=['*tests*']), # I just use wild card. Works perfect ^-^
  install_requires=['xmltodict==0.9.0',
                    'pymongo==2.7.2',
                    'ftputil==3.1',
                    'psutil==2.1.1',
                    'suds==0.4',
                    ],
  include_package_data=True,
  )

FYI:

I would also recommend adding following into .gitignore.

build
dist
pybueno.egg-info

And move build and pushing package to pypi or your private repository bit into CI/CD to make whole setup look clean and neat.