Python 编译.pyx文件时缺少numpy/arrayobject.h
从Enthough安装顶棚。在构建我的Python 编译.pyx文件时缺少numpy/arrayobject.h,python,macos,numpy,Python,Macos,Numpy,从Enthough安装顶棚。在构建我的.pyx文件时,我遇到了这个错误(后面是更多错误) 我是否需要轻松安装其他软件包以获得“开发”版本,从而获得.h文件 gcc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -DNDEBUG -g -O3 -arch x86_64 -I/Applications/Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Conten
.pyx
文件时,我遇到了这个错误(后面是更多错误)
我是否需要轻松安装其他软件包以获得“开发”版本,从而获得.h
文件
gcc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -DNDEBUG -g -O3 -arch x86_64 -I/Applications/Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Contents/include/python2.7 -c tsBinner.c -o build/temp.macosx-10.6-x86_64-2.7/tsBinner.o
tsBinner.c:314:31: error: numpy/arrayobject.h: No such file or directory
tsBinner.c:315:31: error: numpy/ufuncobject.h: No such file or directory
更多上下文
这可以在几个Linux安装下编译和运行,但不适用于我最近安装的Canopy发行版python
下面是setup.py的内容
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [Extension("tsBinner",["tsBinner.pyx"])]
setup(
name ='time stamp binner',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
下面是tsBinner.py的内容
from __future__ import division
import numpy as np
cimport numpy as np
#cimport cython
#@cython.boundscheck(False)
def tsBinner(np.ndarray[np.uint64_t, ndim=1] tstamps, \
np.ndarray[np.int_t, ndim=1] bins):
"""
bin the values of the tstamps array into the bins array.
tstamps array is of type np.uint64
bins array is of type int
"""
cdef int nTStamps = tstamps.shape[0]
cdef int iTStamp
for iTStamp in range(nTStamps):
bins[tstamps[iTStamp]] += 1
return
以下是python和gcc的版本
mac-119562:cosmic stoughto$ which python
/Users/stoughto/Library/Enthought/Canopy_64bit/User/bin/python
mac-119562:cosmic stoughto$ which gcc
/usr/bin/gcc
mac-119562:cosmic stoughto$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
mac-119562:cosmic stoughto$ python --version
Python 2.7.3 -- 64-bit
在MacBook Pro Mac OS X 10.7.5版上运行时,可以在setup.py中使用以下参数告诉编译器包含头文件所在的目录:
ext_modules = [Extension("tsBinner",["tsBinner.pyx"],
include_dirs = ["/full/path/python2.7/site-packages/numpy/core/include/"])];
这是所有树冠分布中都存在的问题。下面的答案适用于Mac。在Linux和Windows中做什么应该是相当明显的;文件夹只是略有不同
生成.c文件后,setup.py文件会自动为您运行以下命令
gcc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -DNDEBUG -g -O3 -arch x86_64 -I/Applications/Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Contents/include/python2.7 -c MyCythonCode.c -o build/temp.macosx-10.6-x86_64-2.7/MyCythonCode.o
然后您会得到关于丢失的.h文件的错误:arrayobject.h
和ufunobject.h
查看上面的代码,特别是-I
选项,问题在于gcc正在以下位置查找这些文件:
/Applications/Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Contents/include/python2.7
在终端窗口中键入以下内容,以查找这些文件的位置:
find /Applications/ -name "ufuncobject.h"
在我的Mac电脑上安装雨篷时,它们出现在几个地方。我感兴趣的位置是最新的Canopy更新的文件夹(我是1.1.0.1371)。因此,对于我来说,这些文件位于:
/Applications//Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages/numpy/core/include/numpy/ufuncobject.h
请注意,错误消息要求在名为numpy
的文件夹中提供两个文件。如果只是复制有问题的两个文件,则会遇到更多错误。复制整个numpy
文件夹,在本例中是位于以下位置的文件夹(比以前多了一个文件夹):
将此文件夹粘贴到编译器正在查找的文件夹中(即上面列出的-i
选项)。就我而言,这是:
/Applications//Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Contents/lib/python2.7/
现在再次尝试运行安装文件。应该没问题
我总是发现这是一个令人兴奋的问题。尽管环境保护署(EPD)和天篷(Canopy)都很棒,但每次都必须手动修复,这真是一件痛苦的事
希望这能有所帮助。这是一个相当古老的问题,但它是一个常见的问题,其他答案都很糟糕。硬连线numpy的include目录完全破坏了虚拟环境,使软件包很难自动分发和安装。解决此问题的正确方法是使用
numpy.get_include()
获取与当前加载的numpy版本关联的目录。这显示在对类似问题的回答中。setup.py
如下所示:
import numpy
setup(
name ='time stamp binner',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
include_dirs = [numpy.get_include()] #Include directory not hard-wired
)
更多的上下文会更好。我有同样的问题,你必须在你的gcc命令中包含
-I../site packages/numpy/core/include
。你可以尝试从numpy.distutils.core
导入,而不是distutils.core
,不确定这是否会有什么不同。Jaime,很抱歉,更改导入不起作用。Saullo,谢谢,那很有帮助。在运行命令“python setup.py buils_ext--inplace”之前,我通过将环境变量CPATH设置为/Users/../site packages/numpy/core来实现这一点。是否有一种方法可以包含逻辑(在setup.py中?)以使其更具可移植性?
import numpy
setup(
name ='time stamp binner',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
include_dirs = [numpy.get_include()] #Include directory not hard-wired
)