2017-06-21 1 views
0

Des questions similaires ont été posées plusieurs fois, mais malheureusement, j'ai encore rencontré un problème avec l'utilisation de Cython avec Numpy. Prenez cet exemple minimal (qui suit à peu près les exemples here):Cython avec `cimport numpy` échoue

# file test.pyx 
import numpy as np 
#cimport numpy as np 

def func(): 
    print("hello") 

que j'essaie de construire avec:

from distutils.core import setup 
from Cython.Build import cythonize 
import numpy as np 
import os 

os.environ["CC"] = "g++-7" 

setup(
    ext_modules = cythonize("test.pyx", include_path = [np.get_include()]) 
) 

Cet exemple fonctionne (python setup.py build_ext --inplace), jusqu'à ce que je Décommentez la ligne cimport ... , après quoi je reçois bien connaître l'erreur:

fatal error: numpy/arrayobject.h: No such file or directory

le chemin retourné par np.get_include() a le arrayobject.h tête, mais dans la commande g++ réelle qui est exécuté, l'include dir manque comme -I/...:

g++-7 -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/include/python3.6m -c test.c -o build/temp.macosx-10.11-x86_64-3.6/test.o

Toute idée de ce qui pourrait causer ce problème? J'utilise Python 3.6.1 sur Mac OS, tout (Cython, Numpy, ..) installé avec pip3 et Cython 0.25.2.

+0

Pouvez-vous essayer: 'ext_modules = cythonize ((extension ("test", sources = [ "test.pyx"], include_dirs = [np.get_include()], ), ))' –

+0

également , quelle est la version de Cython? 'cython3 --version' –

+0

Pierre, c'est magique! Cela fonctionne, même si je ne sais pas pourquoi/comment (encore) – Bart

Répondre

2

Au lieu de la simple commande cythonize, utilisez

ext_modules = cythonize((Extension("test", sources=["test.pyx"], include_dirs=[np.get_include()],),)) 

L'option include_dirs est donnée ici à "Extension" au lieu d'utiliser include_path avec "cythonize".