In your setup.py
, the Extension
should have the argument include_dirs=[numpy.get_include()]
.
Also, you are missing np.import_array()
in your code.
--
Example setup.py:
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy
setup(
ext_modules=[
Extension("my_module", ["my_module.c"],
include_dirs=[numpy.get_include()]),
],
)
# Or, if you use cythonize() to make the ext_modules list,
# include_dirs can be passed to setup()
setup(
ext_modules=cythonize("my_module.pyx"),
include_dirs=[numpy.get_include()]
)
For a one-file project like yours, another alternative is to use pyximport
. You don't need to create a setup.py
... you don't need to even open a command line if you use IPython ... it's all very convenient. In your case, try running these commands in IPython or in a normal Python script:
import numpy
import pyximport
pyximport.install(setup_args={"script_args":["--compiler=mingw32"],
"include_dirs":numpy.get_include()},
reload_support=True)
import my_pyx_module
print my_pyx_module.some_function(...)
...
You may need to edit the compiler of course. This makes import and reload work the same for .pyx
files as they work for .py
files.
Source: http://wiki.cython.org/InstallingOnWindows
The error means that a numpy header file isn't being found during compilation.
Try doing export CFLAGS=-I/usr/lib/python2.7/site-packages/numpy/core/include/
, and then compiling. This is a problem with a few different packages. There's a bug filed in ArchLinux for the same issue: https://bugs.archlinux.org/task/22326
A way simpler way is to add the path to your file distutils.cfg
. It's path behalf of Windows 7 is by default C:\Python27\Lib\distutils\
. You just assert the following contents and it should work out:
[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include
To give you an example how the config file could look like, my entire file reads:
[build]
compiler = mingw32
[build_ext]
include_dirs= C:\Python27\Lib\site-packages\numpy\core\include
compiler = mingw32
It should be able to do it within cythonize()
function as mentioned here, but it doesn't work beacuse there is a known issue
If you are too lazy to write setup files and figure out the path for include directories,
try cyper. It can compile your Cython code and set include_dirs
for Numpy automatically.
Load your code into a string, then simply run cymodule = cyper.inline(code_string)
, then your function is available as cymodule.sparsemaker
instantaneously. Something like this
code = open(your_pyx_file).read()
cymodule = cyper.inline(code)
cymodule.sparsemaker(...)
# do what you want with your function
You can install cyper via pip install cyper
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With