setup.py excluye algunos archivos python de bdist

Tengo un proyecto django con este tipo de architecture:

  • setup.py
  • proyecto/
    • __init__.py
    • manage.py
    • ajustes /
      • __init__.py
      • base.py
      • dev.py
    • urls /
      • __init__.py
      • base.py
      • dev.py

Quería implementarlo en un archivo .egg sin mis archivos ‘dev.py’. Probé diferentes maneras: primero, con un

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

, luego con un MANIFEST.in que contiene:

 global-exclude dev.py 

La segunda solución parece funcionar cuando hago un sdist, con esta advertencia cuando lo instalo:

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

, pero no funciona con un huevo bdist.

Aquí una parte de mi 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']), ) 

Tenga en cuenta que uso Python 2.6.6, tal vez sea importante. ¿Alguna idea de cómo crear mi huevo excluyendo los archivos dev correctamente?

Recientemente tuve el mismo problema (aunque tuve que construir una rueda en lugar de un huevo), la solución funciona igual para bdist_egg y bdist_wheel . find_package_modules anular el método find_package_modules en 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}, ) 

En este ejemplo, los módulos llamados dev en todos los paquetes se excluirán de la comstackción.

Como puede ver, no es necesario jugar con exclusiones en find_packages() ya que todavía necesita que se incluyan todos los paquetes, pero en su lugar, filtre los archivos de módulo que se encuentran en cada paquete. La clase build_py es bastante genérica y podría ser refaccionada en una biblioteca separada si necesita reutilizarla; Lo único específico del proyecto es la lista de patrones de exclusión.

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