setup.py исключить некоторые файлы Python из bdist - PullRequest
9 голосов
/ 12 мая 2011

У меня есть проект django с такой архитектурой:

  • setup.py
  • project /
    • __ init __. Py
    • manage.py
    • settings /
      • __ init __. py
      • base.py
      • dev.py
    • urls/
      • __ init __. Py
      • base.py
      • dev.py

Iхотел развернуть его в .egg без моих файлов 'dev.py'.Я пробовал разные способы: сначала с

find_packages(exclude=['*.dev','dev'])

, затем с MANIFEST.in, который содержит:

global-exclude dev.py

Второе решение, кажется, работает, когда я делаю sdist - сэто предупреждение при установке:

warning: no previously-included files matching 'dev.py' found anywhere in distribution 

, но не работает с bdist-egg.

Здесь часть моего setup.py:

from setuptools import setup, find_packages
project import VERSION


packages = [
        'project',
        'project.settings',
        'project.urls',
]

setup(name='project',
  version=VERSION,
  package_dir = {'project' : 'project'},
  description  = 'My Project',
  author       = 'Simon Urli',
  author_email = '',
  url = '',
  packages = packages, #find_packages('project',exclude=['*.dev', 'dev']),
)

Обратите внимание, что я использую Python 2.6.6, возможно, это имеет значение.Любая идея, как создать мое яйцо, исключая файлы dev должным образом?

Ответы [ 2 ]

2 голосов
/ 29 мая 2018

У меня недавно была такая же проблема (хотя мне пришлось построить колесо вместо яйца), решение работает одинаково как для bdist_egg, так и для bdist_wheel. Вы должны переопределить метод find_package_modules в build_py:

import fnmatch
from setuptools import find_packages, setup
from setuptools.command.build_py import build_py as build_py_orig


exclude = ['*.dev']


class build_py(build_py_orig):

    def find_package_modules(self, package, package_dir):
        modules = super().find_package_modules(package, package_dir)
        return [(pkg, mod, file, ) for (pkg, mod, file, ) in modules
                if not any(fnmatch.fnmatchcase(pkg + '.' + mod, pat=pattern)
                for pattern in exclude)]


setup(
    packages=find_packages(),
    cmdclass={'build_py': build_py},
)

В этом примере модули с именем dev во всех пакетах будут исключены из сборки.

Как видите, в find_packages() нет необходимости играть с исключениями, поскольку вам все еще нужно включить все пакеты, но вместо этого вы фильтруете файлы модулей, найденные в каждом пакете. Класс build_py в значительной степени является общим и может быть реорганизован в отдельную библиотеку, если вам потребуется его повторно использовать; единственный специфический для проекта материал - это список шаблонов исключений.

0 голосов
/ 02 декабря 2013
def without_app(item):
    # http://docs.python.org/release/2.2.1/lib/string-methods.html
    return not bool(item.find('app_name') + 1) 

# help(filter) - use in command line to read the docstring
packages = filter(without_app, find_packages()) 
...