python numpy cython f2py

python - setup.py para paquetes que dependen de cython y f2py



numpy (2)

Puede llamar a cada uno por separado en su setup.py como en
http://answerpot.com/showthread.php?601643-cython%20and%20f2py

# Cython extension from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext setup( ext_modules = [Extension( ''cext'', [''cext.pyx''] )], cmdclass = {''build_ext'': build_ext}, script_args = [''build_ext'', ''--inplace''], ) # Fortran extension from numpy.distutils.core import setup, Extension setup( ext_modules = [Extension( ''fext'', [''fext.f90''] )], )

Tu contexto de llamada (creo que llaman a este espacio de nombres, no estoy seguro)
Tiene que cambiar en cuanto a cuál es la extensión y función del objeto actual.
setup () es.

La primera llamada a setup (), es la distutils.extension.Extension
y distutils.core.setup ()

La segunda llamada a setup (), es el numpy.distutils.core.Extension
y numpy.distutils.core.setup ()

Me gustaría crear un script setup.py para un paquete de Python con varios submódulos que dependen tanto de cython como de f2py. He intentado usar setuptools y numpy.distutils, pero hasta ahora he fallado:

Usando setuptools

Puedo compilar mis extensiones de cython (y crear una instalación para el resto del paquete) usando setuptools. Sin embargo, no he podido averiguar cómo usar setuptools para generar la extensión f2py. Después de una extensa búsqueda, solo encontré mensajes más antiguos como éste que indican que los módulos f2py deben compilarse usando numpy.distutils.

Utilizando numpy.distutils

Puedo compilar mis extensiones f2py (y crear una instalación para el resto del paquete) usando numpy.distutils. Sin embargo, no he podido averiguar cómo obtener numpy.distutils para compilar mis extensiones de cython, ya que siempre intenta usar pyrex para compilarlo (y estoy usando extensiones específicas de cython) recientes. He realizado una búsqueda para averiguar cómo obtener numpy.distutils para los archivos de cython y, al menos desde hace un año, recomiendan aplicar un parche de mono a numpy.distutils. Parece que aplicar ese parche de mono también restringe las opciones que se pueden pasar a Cython.

Mi pregunta es: ¿cuál es la forma recomendada de escribir un script setup.py para paquetes que dependen tanto de f2py como de cython? ¿La aplicación de un parche a numpy.distutils realmente es el camino a seguir?


Resulta que esto ya no es cierto. Con setuptools y distutils (al menos la versión numpy ) es posible tener extensiones con C, Cython y f2py. La única advertencia es que para compilar módulos f2py siempre se debe usar numpy.distutils tanto para la setup como para las funciones de Extension . Pero setuptools todavía se puede usar para la instalación (por ejemplo, permite la instalación de una versión de desarrollador con python setup.py develop ).

Para usar distutils exclusivamente utilizas lo siguiente:

from numpy.distutils.core import setup from numpy.distutils.extension import Extension

Para utilizar setuptools , debe importarlo antes de que se distutils los distutils :

import setuptools

Y luego el resto del código es idéntico:

from numpy import get_include from Cython.Build import cythonize NAME = ''my_package'' NUMPY_INC = get_include() extensions = [ Extension(name=NAME + ".my_cython_ext", include_dirs=[NUMPY_INC, "my_c_dir"] sources=["my_cython_ext.pyx", "my_c_dir/my_ext_c_file.c"]), Extension(name=NAME + ".my_f2py_ext", sources=["my_f2py_ext.f"]), ] extensions = cythonize(extensions) setup(..., ext_modules=extensions)

Obviamente, necesitas poner todas tus otras cosas en la llamada de setup() . En lo que antecede, asumo que utilizará numpy con Cython, junto con un archivo C externo ( my_ext_c_file.c ) que estará en my_c_dir/ , y que el módulo f2py es solo un archivo Fortran. Ajuste según sea necesario.