Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

setup.py exclude some python files from bdist

I have a django project with this kind of architecture :

  • setup.py
  • project/
    • __init__.py
    • manage.py
    • settings/
      • __init__.py
      • base.py
      • dev.py
    • urls/
      • __init__.py
      • base.py
      • dev.py

I wanted to deploy it in a .egg without my 'dev.py' files. I tried different ways : first, with a

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

, then with a MANIFEST.in which contains :

global-exclude dev.py

The second solution seems to work when I do a sdist - with this warning when I install it :

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

, but does'nt work with a bdist-egg.

Here a part of my 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']),
)

Note that I use python 2.6.6, maybe it matters. Any idea how to create my egg excluding the dev files properly ?

like image 458
Simon Urli Avatar asked May 12 '11 07:05

Simon Urli


People also ask

What is Package_data in setup py?

package_data. By default, include_package_data considers all non .py files found inside the package directory ( src/mypkg in this case) as data files, and includes those that satisfy (at least) one of the above two conditions into the source distribution, and consequently in the installation of your package.

What does Setup py clean do?

As far as I know, it just removes the the build subdirectory, where Python puts all the files to be installed, including extensions that need to be compiled.

What should setup py contain?

The setup.py file may be the most significant file that should be placed at the root of the Python project directory. It primarily serves two purposes: It includes choices and metadata about the program, such as the package name, version, author, license, minimal dependencies, entry points, data files, and so on.

Does Python package require setup py?

A Python file that relies only on the standard library can be redistributed and reused without the need to use setuptools. But for projects that consist of multiple files, need additional libraries, or need a specific version of Python, setuptools will be required.


1 Answers

I had the same issue recently (although I had to build a wheel instead of an egg), the solution works the same both for bdist_egg and bdist_wheel. You have to override the method find_package_modules in 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},
)

In this example, modules named dev in all packages will be excluded from the build.

As you can see, there's no need to play with exclusions in find_packages() as you still need all packages to be included, but instead you filter the module files found in each package. The class build_py is pretty much generic and could be refactored in a separate library if you need to reuse it; the only project-specific stuff is the list of exclude patterns.

like image 154
hoefling Avatar answered Sep 22 '22 23:09

hoefling