What does cmdclass do in Pythons setuptools?
Question: I've recently got a pull request which added

    
    
    class build_ext(_build_ext):
        'to install numpy'
        def finalize_options(self):
            _build_ext.finalize_options(self)
            # Prevent numpy from thinking it is still in its setup process:
            __builtins__.__NUMPY_SETUP__ = False
            import numpy
            self.include_dirs.append(numpy.get_include())
    

to my `setup.py` resulting in:

    
    
    from setuptools.command.build_ext import build_ext as _build_ext
    
    try:
        from setuptools import setup
    except ImportError:
        from distutils.core import setup
    
    
    class build_ext(_build_ext):
        'to install numpy'
        def finalize_options(self):
            _build_ext.finalize_options(self)
            # Prevent numpy from thinking it is still in its setup process:
            __builtins__.__NUMPY_SETUP__ = False
            import numpy
            self.include_dirs.append(numpy.get_include())
    
    
    config = {
        'cmdclass':{'build_txt':build_ext}, #numpy hack
        'setup_requires':['numpy'],         #numpy hack
        'name': 'nntoolkit',
        'version': '0.1.25',
        'author': 'Martin Thoma',
        'author_email': 'info@martin-thoma.de',
        'packages': ['nntoolkit'],
        'scripts': ['bin/nntoolkit'],
        'url': 'https://github.com/MartinThoma/nntoolkit',
        'license': 'MIT',
        'description': 'Neural Network Toolkit',
        'long_description': """...""",
        'install_requires': [
            "argparse",
            "theano",
            "nose",
            "natsort",
            "PyYAML",
            "matplotlib",
            "h5py",
            "numpy",
            "Cython"
        ],
        'keywords': ['Neural Networks', 'Feed-Forward', 'NN', 'MLP'],
        'download_url': 'https://github.com/MartinThoma/nntoolkit',
        'classifiers': ['Development Status :: 3 - Alpha'],
        'zip_safe': False,
        'test_suite': 'nose.collector'
    }
    
    setup(**config)
    

What does it do?

The [documentation](https://docs.python.org/2/distutils/apiref.html) only
states:

> cmdclass: A mapping of command names to
> [**`Command`**](https://docs.python.org/2/distutils/apiref.html?highlight=cmdclass#distutils.core.Command)
> subclasses (a dictionary)


Answer: Numpy libraries are written in C/C++. So unlike other packages, it needs to be
compiled before actually calling them. So 'build_ext' just compiles them.

Details in blog: <http://www.sadafnoor.com/blog/how-to-automate-numpy-in-
setuptool/>

