python numpy setuptools bootstrapping

python - Cómo arrancar la instalación numpy en setup.py



setuptools bootstrapping (4)

Este es un problema fundamental con los paquetes que necesitan usar numpy (para distutils o get_include). No conozco una forma de "ajustarlo" con pip o instalarlo fácilmente.

Sin embargo, es fácil hacer un paquete de Conda para su módulo y proporcionar la lista de dependencias para que alguien pueda simplemente hacer un Conda instalar pkg-name que descargará e instalará todo lo necesario.

Conda está disponible en Anaconda o en Miniconda (python + just conda).

Consulte este sitio web: http://docs.continuum.io/conda/index.html o este paquete de diapositivas para obtener más información: https://speakerdeck.com/teoliphant/packaging-and-deployment-with-conda

Tengo un proyecto que tiene una extensión C que requiere numpy. Idealmente, me gustaría que quienquiera que descargue mi proyecto sea capaz de ejecutar python setup.py install o usar una llamada a pip . El problema que tengo es que en mi setup.py necesito importar numpy para obtener la ubicación de los encabezados, pero me gustaría que numpy sea un requisito regular en install_requires para que se descargue automáticamente del Índice de Paquetes de Python .

Aquí hay una muestra de lo que estoy tratando de hacer:

from setuptools import setup, Extension import numpy as np ext_modules = [Extension(''vme'', [''vme.c''], extra_link_args=[''-lvme''], include_dirs=[np.get_include()])] setup(name=''vme'', version=''0.1'', description=''Module for communicating over VME with CAEN digitizers.'', ext_modules=ext_modules, install_requires=[''numpy'',''pyzmq'', ''Sphinx''])

Obviamente, no puedo import numpy en la parte superior antes de instalarlo. He visto un argumento setup_requires pasado a setup() pero no puedo encontrar ninguna documentación sobre para qué sirve.

es posible?


Lo siguiente funciona al menos con numpy1.8 y python {2.6,2.7,3.3}:

from setuptools import setup from setuptools.command.build_ext import build_ext as _build_ext class build_ext(_build_ext): 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()) setup( ... cmdclass={''build_ext'':build_ext}, setup_requires=[''numpy''], ... )

Para una pequeña explicación, vea por qué falla sin el "hack", vea esta respuesta .

Tenga en cuenta que el uso de setup_requires tiene un inconveniente sutil: numpy no solo se compilará antes de construir extensiones, sino también cuando se hace python setup.py --help , por ejemplo. Para evitar esto, puede buscar opciones de línea de comando, como se sugiere en https://github.com/scipy/scipy/blob/master/setup.py#L205 , pero por otro lado, realmente no creo que valga la pena el esfuerzo.



Tal vez una solución más práctica es simplemente requerir que se instale numpy de antemano e import numpy dentro del alcance de una función. La solución de @coldfix funciona, pero la compilación de números tarda una eternidad. Mucho más rápido de instalarlo primero como un paquete de ruedas, especialmente ahora que tenemos ruedas para la mayoría de los sistemas gracias a esfuerzos como manylinux .

from __future__ import print_function import sys import textwrap import pkg_resources from setuptools import setup, Extension def is_installed(requirement): try: pkg_resources.require(requirement) except pkg_resources.ResolutionError: return False else: return True if not is_installed(''numpy>=1.11.0''): print(textwrap.dedent(""" Error: numpy needs to be installed first. You can install it via: $ pip install numpy """), file=sys.stderr) exit(1) def ext_modules(): import numpy as np some_extention = Extension(..., include_dirs=[np.get_include()]) return [some_extention] setup( ext_modules=ext_modules(), )