【问题标题】:Cython/Numpy - cimport numpy as np failsCython/Numpy - cimport numpy as np 失败
【发布时间】:2014-11-02 21:26:06
【问题描述】:

我正在尝试使用 cython 对我的代码的关键部分进行编码,但我在导入 numpy 时遇到了麻烦:

Setup.py

    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
    import numpy as np

    e_m1 = Extension('OrderC', ['OrderC.pyx'])
    ext_mods = [e_m1]
    setup(name = 'OrderC/ListOrderC',  cmdclass = {'build_ext': build_ext}, 
          include_dirs = [np.get_include()], ext_modules = ext_mods)

OrderC.pyx:

    import numpy as np
    #cimport numpy as np  ## CRITICAL LINE (RUN WITHOUT IT)

    cdef class OrderC:
        cdef double _px

    def __init__(self, double px):
        self._px = px

    def printPx(self):
        print self._px

主要:

    import pyximport; 
    pyximport.install()

    from OrderC import OrderC
    oo = OrderC(9.95)
    oo.printPx()

当我评论关键行时,编译打印警告但运行,这里是警告:

    C:\Users\user\.pyxbld\temp.win32-2.7\Release\pyrex\OrderC.c: In function '__Pyx_RaiseArgtupleInvalid':
    C:\Users\user\.pyxbld\temp.win32-2.7\Release\pyrex\OrderC.c:1264:18: warning: unknown conversion type character 'z' in format [-Wformat=]
              (num_expected == 1) ? "" : "s", num_found);
              ^
    C:\Users\user\.pyxbld\temp.win32-2.7\Release\pyrex\OrderC.c:1264:18: warning: format '%s' expects argument of type 'char *', but argument 5 has type 'Py_ssize_t' [-Wformat=]
    C:\Users\user\.pyxbld\temp.win32-2.7\Release\pyrex\OrderC.c:1264:18: warning: unknown conversion type character 'z' in format [-Wformat=]
    C:\Users\user\.pyxbld\temp.win32-2.7\Release\pyrex\OrderC.c:1264:18: warning: too many arguments for format [-Wformat-extra-args]

但是,当我对关键行进行注释时,它根本不起作用:

构建安装文件给我:

    running build_ext
    cythoning OrderC.pyx to OrderC.c
    building 'OrderC' extension
    C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27_x86\lib\site-packages\numpy\core\include -IC:\Python27_x86\include -IC:\Python27_x86\PC -c OrderC.c -o build\temp.win32-2.7\Release\orderc.o
    In file included from C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/ndarraytypes.h:1804:0,
             from C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/ndarrayobject.h:17,
             from C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/arrayobject.h:4,
             from OrderC.c:352:
    C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/npy_1_7_deprecated_api.h:12:9: note: #pragma message: C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/npy_1_7_deprecated_api.h(12) : Warning Msg: Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
     #pragma message(_WARN___LOC__"Using deprecated NumPy API, disable it by " \
     ^
    OrderC.c: In function '__Pyx_RaiseArgtupleInvalid':
    OrderC.c:3828:18: warning: unknown conversion type character 'z' in format [-Wformat=]
              (num_expected == 1) ? "" : "s", num_found);
              ^
    OrderC.c:3828:18: warning: format '%s' expects argument of type 'char *', but argument 5 has type 'Py_ssize_t' [-Wformat=]
    OrderC.c:3828:18: warning: unknown conversion type character 'z' in format [-Wformat=]
    OrderC.c:3828:18: warning: too many arguments for format [-Wformat-extra-args]
    OrderC.c: In function '__Pyx_RaiseTooManyValuesError':
    OrderC.c:4065:18: warning: unknown conversion type character 'z' in format [-Wformat=]
              "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
              ^
    OrderC.c:4065:18: warning: too many arguments for format [-Wformat-extra-args]
    OrderC.c: In function '__Pyx_RaiseNeedMoreValuesError':
    OrderC.c:4071:18: warning: unknown conversion type character 'z' in format [-Wformat=]
              index, (index == 1) ? "" : "s");
              ^
    OrderC.c:4071:18: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'Py_ssize_t' [-Wformat=]
    OrderC.c:4071:18: warning: too many arguments for format [-Wformat-extra-args]
    In file included from C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/ndarrayobject.h:26:0,
             from C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/arrayobject.h:4,
             from OrderC.c:352:
    OrderC.c: At top level:
    C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/__multiarray_api.h:1629:1: warning: '_import_array' defined but not used [-Wunused-function]
     _import_array(void)
     ^
    In file included from C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/ufuncobject.h:317:0,
             from OrderC.c:353:
    C:\Python27_x86\lib\site-packages\numpy\core\include/numpy/__ufunc_api.h:241:1:         warning: '_import_umath' defined but not used [-Wunused-function]
     _import_umath(void)
     ^
    writing build\temp.win32-2.7\Release\OrderC.def
    C:\MinGW\bin\gcc.exe -shared -s build\temp.win32-2.7\Release\orderc.o build\temp.win32-2.7\Release\OrderC.def -LC:\Python27_x86\libs -LC:\Python27_x86\PCbuild -lpython27 -lmsvcr90 -o C:\Users\user\Desktop\Workspace\TestC\OrderC.pyd

所以没有严重错误,但有很多(奇怪的)警告。

执行:

当我执行 main 时,它给了我:

    C:\Users\mmahfouda\.pyxbld\temp.win32-2.7\Release\pyrex\OrderC.c:352:31: fatal error: numpy/arrayobject.h: No such file or directory
     #include "numpy/arrayobject.h"
                           ^
    compilation terminated.
    Traceback (most recent call last):
      File "C:\Users\mmahfouda\Desktop\Workspace\TestC\MainTestC.py", line 4, in <module>
from OrderC import OrderC
      File "C:\Python27_x86\lib\site-packages\pyximport\pyximport.py", line 431, in load_module
language_level=self.language_level)
      File "C:\Python27_x86\lib\site-packages\pyximport\pyximport.py", line 209, in load_module
inplace=build_inplace, language_level=language_level)
      File "C:\Python27_x86\lib\site-packages\pyximport\pyximport.py", line 186, in build_module
reload_support=pyxargs.reload_support)
      File "C:\Python27_x86\lib\site-packages\pyximport\pyxbuild.py", line 104, in pyx_to_dll
dist.run_commands()
      File "C:\Python27_x86\lib\distutils\dist.py", line 953, in run_commands
self.run_command(cmd)
      File "C:\Python27_x86\lib\distutils\dist.py", line 972, in run_command
cmd_obj.run()
      File "C:\Python27_x86\lib\site-packages\Cython\Distutils\build_ext.py", line 163, in run
_build_ext.build_ext.run(self)
      File "C:\Python27_x86\lib\distutils\command\build_ext.py", line 337, in run
self.build_extensions()
      File "C:\Python27_x86\lib\site-packages\Cython\Distutils\build_ext.py", line 171, in build_extensions
self.build_extension(ext)
      File "C:\Python27_x86\lib\distutils\command\build_ext.py", line 496, in build_extension
depends=ext.depends)
      File "C:\Python27_x86\lib\distutils\ccompiler.py", line 574, in compile
self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
      File "C:\Python27_x86\lib\distutils\cygwinccompiler.py", line 166, in _compile
raise CompileError, msg
    ImportError: Building module OrderC failed: ["CompileError: command 'C:\\\\MinGW\\\\bin\\\\gcc.exe' failed with exit status 1\n"]

有关信息,我的框架是: * Windows 7的 * 派德夫 * Python 2.7(32 位)

您是否有同样的错误或知道为什么这个简单的程序不起作用?

谢谢。

【问题讨论】:

  • This:fatal error: numpy/arrayobject.h: No such file or directory 表示您没有安装 numpy 开发版本。您需要 numpy 头文件才能使用 numpy 进行编译。
  • 另外,请查看this question,看看是否有帮助(尽管这似乎与您缺少的numpy.include_dirs()有关。
  • 我在这里使用 numpy 版本:lfd.uci.edu/~gohlke/pythonlibs/#numpy (numpy‑MKL‑1.9.0.win32‑py2.7)。你说的不是正确的 numpy 版本吗?
  • 我安装了numpy的superpack版本,问题依旧。此外,我的 numpy 文件夹中有 arrayobject.h 文件。
  • arrayobject.h 的完整路径是什么?

标签: python numpy cython


【解决方案1】:

我发布了对我有用的解决方案:

正如他所说,当您将额外的 C 库用作 numpy 时,问题来自于使用 pyximport 进行编译。

我修改了主文件如下:

from OrderC import OrderC
oo = OrderC(9.95)
oo.printPx()

那么,

  1. 用 Cython 编译:

    C:\Python27_x86\Scripts\cython.exe OrderC.pyx

  2. 用gcc编译c文件(包括额外的库)

    C:\MinGW\bin\gcc.exe -mdll -O -Wall -IC:\Python27_x86\lib\site-packages\numpy\core\include -IC:\Python27_x86\include -IC:\Python27_x86\PC -c OrderC.c -o OrderC.o

  3. 用gcc编译c文件(包括额外的库)

    C:\MinGW\bin\gcc.exe -shared -s OrderC.o -LC:\Python27_x86\libs -LC:\Python27_x86\PCbuild -lpython27 -lmsvcr90 -o C:\Users\user\Desktop\Workspace \TestC\OrderC.pyd

然后就可以了。

注意:

  • 第 2 步会生成警告但有效

  • 确保在 PATH 环境变量中添加 OrderC 路径

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2016-02-10
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多