setup.py исключить некоторые файлы python из bdist

#python #django #deployment #installation #setuptools

#python #django #развертывание #установка #setuptools

Вопрос:

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

  • setup.py
  • проект/
    • __init__.py
    • manage.py
    • Настройки/
      • __init__.py
      • base.py
      • dev.py
    • url-адреса/
      • __init__.py
      • base.py
      • dev.py

Я хотел развернуть его в .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, возможно, это имеет значение.
Есть идеи, как правильно создать мое яйцо, исключая файлы разработчика?

Ответ №1:

Недавно у меня была такая же проблема (хотя мне пришлось создать колесо вместо яйца), решение работает одинаково как для 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 в значительной степени универсальный и может быть переработан в отдельной библиотеке, если вам нужно его повторно использовать; единственное, что относится к конкретному проекту, — это список шаблонов исключения.

Комментарии:

1. Спасибо за ваш ответ. Поскольку мой вопрос был задан 7 лет назад, я больше не работаю над этим. Извините, я не отмечаю это как ответ, потому что я не буду это проверять. Если кто-нибудь подтвердит, что это работает, я тогда 😉

2. Эй, нет проблем! Я нашел этот вопрос, когда сам искал ответ, поэтому хотел поделиться своим решением, поскольку вопрос довольно популярен; возможно, однажды это кому-то поможет.

3. super () не работает в python 2.7, и все мои попытки создать экземпляр родительского класса и заставить его работать потерпели неудачу. Есть идеи, как бы вы сделали это в 2.7, предоставив параметры super ()?

4. @Fizi super(build_py, self).find_package_modules(...) должен сделать.

5. Этого не произошло. Я получил ошибку типа: __init__() принимает ровно 2 аргумента (задано 3). После долгих поисков я столкнулся с проблемой класса NewType против класса OldType, где ожидался тип, но получил classObj. Что в конечном итоге сработало для меня, так это build_py_orig(Дистрибутив()).find_package_modules(пакет, package_dir)

Ответ №2:

 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())