【问题标题】:Missing numpy/arrayobject.h while compiling .pyx file编译 .pyx 文件时缺少 numpy/arrayobject.h
【发布时间】:2013-10-04 03:29:07
【问题描述】:

从 enthought 安装的顶篷。在构建我的 .pyx 文件时,我收到此错误(后跟更多)

我是否需要 easy_install 额外的软件包才能获得“开发”版本,以便获得 .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 上运行

【问题讨论】:

  • 更多上下文会更好。
  • 我遇到了同样的问题,你还必须在你的 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 中?)以使其更便携?

标签: python macos numpy


【解决方案1】:

您可以使用 setup.py 中的以下参数告诉编译器包含头文件所在的目录:

ext_modules = [Extension("tsBinner",["tsBinner.pyx"],
              include_dirs = ["/full/path/python2.7/site-packages/numpy/core/include/"])];

【讨论】:

    【解决方案2】:

    这是在所有 Canopy 发行版中都存在的问题。下面的答案适用于 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.hufuncobject.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 安装,它们出现在几个地方。我感兴趣的位置是最新 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 文件夹,在本例中是位于(上一个文件夹)中的文件夹:

    /Applications//Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages/numpy/core/include/
    

    将此文件夹粘贴到编译器正在查找的文件夹中(即上面列为-I 选项的文件夹)。就我而言,这是:

    /Applications//Canopy.app/appdata/canopy-1.1.0.1371.macosx-x86_64/Canopy.app/Contents/lib/python2.7/
    

    现在尝试再次运行安装文件。应该没问题的。

    我一直发现这是 Enthought 发行版的一个问题。与 EPD 和 Canopy 一样出色,但每次都必须手动修复这个问题真的很痛苦。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      这是一个相当古老的问题,但它是一个常见问题,其他答案非常糟糕。硬连线 numpy 的包含目录完全破坏了虚拟环境,并且会使软件包很难自动分发和安装。解决这个问题的正确方法是使用numpy.get_include() 获取与当前加载的numpy 版本关联的目录。这显示在this 对类似问题的回答中。 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
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 2018-10-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2016-04-07
        相关资源
        最近更新 更多