Проблемы с setuptools - исключая пакеты, включая файлы данных - PullRequest
21 голосов
/ 19 декабря 2011

Я довольно новичок в setuptools. Я видел несколько похожих вопросов, и это сводило меня с ума, что я, похоже, следовал совету, который видел, но setuptools по-прежнему делает что-то отличное от того, что я хочу.

Вот структура моего проекта:

.
..
package1/
    __init__.py
    abc.py
    ...
tests/
    __init__.py
    test_package1.py
LICENSE
README.md
RELEASE
setup.py

А вот содержимое моего setup.py:

#!/usr/bin/env python
import os
#from distutils.core import setup
from setuptools import setup, find_packages

setup(
    name='package1',
    version='1.1',
    test_suite="tests",
    packages=find_packages(exclude=['tests']),    
    include_package_data=True,
    package_data = {
        '': ['LICENSE', 'README.md5', 'RELEASE']
    },   
)

Кроме того, в моем файле манифеста есть:

* * 1010

Я строю смолу с:

python setup.py sdist

Я хочу:

  1. Исключить каталог tests из исходного дистрибутива;
  2. Храните файлы LICENSE, README.md, RELEASE в каталоге site-packages, либо на верхнем уровне, либо внутри каталога package1 (на данный момент я соглашаюсь либо на).

Вместо этого вот что происходит:

  1. tests остается в созданном архиве tar и устанавливается на пакеты сайта;
  2. Файлы копируются в архив, но не устанавливаются в каталог пакета, упакованный с сайта.

У меня нет идей, может кто-нибудь объяснить мне, что я делаю неправильно и как это исправить?

Ответы [ 5 ]

21 голосов
/ 10 октября 2014

find_packages использует fnmatchcase для своей исключающей фильтрации.Вы можете проверить, соответствует ли ваш шаблон исключения имени пакета, следующим образом:

>>> from fnmatch import fnmatchcase
>>> fnmatchcase('my.package.name.tests', 'tests')
False

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

setup(
    name='package1',
    version='1.1',
    packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']),    
)

Чтобы также исключить папку tests из исходных дистрибутивов, добавьте следующее в MANIFEST.in:

recursive-exclude tests *
17 голосов
/ 26 июля 2012

Вы должны создать новый файл с именем MANIFEST.in в корневом уровне вашего пакета, а затем следуйте этим инструкциям:

  1. Чтобы контролировать, какие файлы окажутся в вашем tar-файле, создайте новый файл с именем MANIFEST.in на корневом уровне вашего пакета. Например, вы можете исключить целые каталоги из вашего дистрибутива, используя recursive-exclude в файле MANIFEST.in. В вашем случае вам нужно, чтобы ваш MANIFEST.in файл содержал:

    recursive-exclude tests *
    
  2. Не принято включать README и другие файлы в каталог site-packages, но если вы действительно этого хотите, перейдите внутрь package1 и создайте символические ссылки на файлы, которые вы хотите включить:

    cd package1
    ln -s ../LICENSE
    ln -s ../README.md
    ln -s ../RELEASE
    

    Затем измените следующую строку в вашем файле setup.py:

    .
    package_data = {
        '': ['LICENSE', 'README.md', 'RELEASE']
    

    до:

    package_data = {
        'package1': ['LICENSE', 'README.md', 'RELEASE']
    
0 голосов
/ 06 февраля 2019

Я пытался все, и ничего не получалось, пока я не удалил каталог build (после просмотра другого ответа, упоминающего *.egg-info/ каталог ), и он наконец заработал. python setup.py clean --all также должен выполнить работу.

0 голосов
/ 20 сентября 2017

MANIFEST.in позаботится об этом.

prune tests/
include LICENSE  README.md RELEASE

если у вас есть статические файлы для добавления, добавьте их с помощью

...
recursive-include package1/static *
0 голосов
/ 19 декабря 2011

, если ваша структура верна:

  1. папка test не является пакетом (в ней нет файла init .py), поэтому find_package не исключает его.
  2. include_package_data = True означает, что все версионные файлы будут включены, если явно не исключены.

так: попробуйте исключить тесты / * в вашем MANIFEST.in

Надеюсь, это помогло

...