[Distutils] (extension) module dependencies in setuptools

Andrew Straw strawman at astraw.com
Tue Jan 24 08:50:21 CET 2006


I would like to propose a feature for setuptools: runtime enforcement of
dependencies specified at build time by setup.py. I appreciate that
"pkg_resources.require('foo==1.0')" works, but this requires a tedious
update of version numbers in affected source files every time you
upgrade foo and rebuild the target package. I'm thinking, in particular,
of extension modules built on a particular version of another package
with its own C interface. Think matplotlib.backends._ns_backend_agg
depending on numpy. It would be really nice, in matplotlib's setup.py
file, to say something like:

from setuptools import setup, Extension
import numpy
numpy_include_dirs = numpy.get_numpy_include()
setup(name='matplotlib',
    ext_modules=Extension('matplotlib.backends._ns_backend_agg',
        sources='src/backends/_ns_backend_agg.cpp',
        include_dirs=numpy_include_dirs,
       
runtime_requires=[pkg_resources.get_distribution('numpy').as_requirement()],
    )
)

Alternatively, the whole package (not just the extension module) might
depend on a particular version:

from setuptools import setup
import numpy
numpy_include_dirs = numpy.get_numpy_include()
setup(name='matplotlib',
    ext_modules=Extension('matplotlib.backends._ns_backend_agg',
        sources='src/backends/_ns_backend_agg.cpp',
        include_dirs=numpy_include_dirs,
    )
   
runtime_requires=[pkg_resources.get_distribution('numpy').as_requirement()],
)

Now, if I installed an additional, newer numpy, a couple of things could
happen: if my application imports matplotlib first, setuptools puts the
appropriate (older) numpy into the global working_set and I get this
older numpy when I do "import numpy". If my application imports (the
newer) numpy first and then matplotlib, an exception is raised saying
that matplotlib depends of versions such and such but version so and so
is already imported.

Because I'm thinking primarily of extension modules, there are
additional reasons why I don't want to specify a runtime check using a
hardcoded pkg_resources.require() in the package itself. First, the
actual requirement may be a C-interface issue leading to segfaults and
other nastiness if ignored or forgotten, thus justifying this easier way
to specify dependencies. Second, an extension module, by definition, is
not Python, so it will take more programming effort to write the call to
pkg_resources.require(). Third, I really don't want to have to convince
all the projects out there to modify multiple files to use setuptools.
I'm already attempting to dispel enough anti-egg sentiment (for reasons
I don't understand) resulting from slight changes to setup.py.

What do folks think about this idea? Would such a feature be possible
and desirable in setuptools?

Cheers!
Andrew


More information about the Distutils-SIG mailing list