Setup.py sdist исключает пакеты в подкаталоге

У меня есть следующая структура проекта, которую я хотел бы упаковать:

├── doc
│   └── source
├── src
│   ├── core
│   │   ├── config
│   │   │   └── log.tmpl
│   │   └── job
│   ├── scripts
│   └── test
└── tools

Я хотел бы упаковать core под src, но исключить test. Вот что я пробовал безуспешно:

      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=["test"]), # I also tried exclude=["src/test"]
      install_requires=['xmltodict==0.9.0',
                        'pymongo==2.7.2',
                        'ftputil==3.1',
                        'psutil==2.1.1',
                        'suds==0.4',
                        ],
      include_package_data=True,
      )

Я знаю, что могу исключить test с помощью файла MANIFEST.in, но я был бы рад, если бы вы могли показать мне, как это сделать с помощью setup и find_packages.

Обновление:

После того, как я немного поиграл, я понял, что построение пакета с python setup.py install делает то, что я ожидал (то есть он исключает test). Однако выдача python setup.py sdist заставляет все включаться (то есть игнорирует мою директиву exclude). Я не знаю, является ли это ошибкой или функцией, но по-прежнему существует возможность исключения файлов в sdist с помощью MANIFEST.in.

Ответ 1

find_packages("src", exclude=["test"]) работает.
Хитрость заключается в удалении устаревших файлов, таких как каталог core.egg-info. В вашем случае вам нужно удалить src/core.egg-info.

Здесь setup.py Я использовал:

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']},
)

Чтобы создать дистрибутивы, запустите:

$ python setup.py sdist bdist bdist_wheel

Чтобы включить последнюю команду, запустите: pip install wheel.

Я проверил созданные файлы. Они не содержат test, но содержат файлы core/__init__.py, core/config/log.tmpl.

Ответ 2

В MANIFEST.in в корне проекта добавьте

prune src/test/

затем создайте пакет с python setup.py sdist

Ответ 3

Предполагая, что ваша папка называется test, а не test, она должна работать со следующим кодом:

  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'])
  install_requires=['xmltodict==0.9.0',
                    'pymongo==2.7.2',
                    'ftputil==3.1',
                    'psutil==2.1.1',
                    'suds==0.4',
                    ],
  include_package_data=True,
  )