将python和numpy嵌入C ++时import_array()错误

时间:2018-08-29 09:34:53

标签: c++ python-2.7 numpy import

我编写了一个简单的代码,试图在C ++中使用numpy。 我的操作系统是ubuntu16.04,带有gcc5.4.0Python2.7.12numpy1.15.0。 这是我的代码test2.cpp

#include "Python.h"
#include "numpy/arrayobject.h"

int main(int argc, char **argv) 
{
    Py_Initialize();     
    import_array(); 

    Py_Finalize(); 
    return 0; 
}

我这样使用CMakeLists.txt

cmake_minimum_required(VERSION 3.10) 

project(test_python LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE DEBUG)

set(PYTHON_INCLUDE_PATH /usr/include/python2.7)
set(PYTHON_LIBRARY /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so)
set(NUMPY_INCLUDE_PATH /usr/local/lib/python2.7/dist-packages/numpy/core/include)

include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${NUMPY_INCLUDE_PATH})

add_executable(test_python test2.cpp) 
target_link_libraries(test_python 
    ${PYTHON_LIBRARY}
)

但是当我做到这一点时,我遇到了以下编译错误:

/usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/__multiarray_api.h:1547:144: error: return-statement with no value, in function returning ‘int’ [-fpermissive]
 #define import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); return NUMPY_IMPORT_ARRAY_RETVAL; } }
                                                                                                                                                ^
/home/camsys/projects/hmr_c/test/test2.cpp:7:5: note: in expansion of macro ‘import_array’
     import_array(); 
     ^

这很奇怪,因为当我将Python3.5Numpy1.15.0一起使用时,一切正常。 有人可以告诉我为什么会发生此错误以及如何解决该问题吗?

我发现了4年前问的另一个类似问题,没有答案Passing C++ array to python。这个问题是关于python3.4,而我正在处理python2.7

1 个答案:

答案 0 :(得分:0)

import_array()是在/usr/local/lib/pythonX.Y/dist-packages/numpy/core/include/numpy/__multiarray_api.h内部定义的宏。在代码预处理期间(在编译之前),该宏的定义被扩展并替换为main函数,如下所示:

int main(int argc, char **argv) 
{
    Py_Initialize();     
    {
        if (_import_array() < 0) {
            PyErr_Print();
            PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import");
            return NUMPY_IMPORT_ARRAY_RETVAL;
        }
    }
    Py_Finalize(); 
    return 0; 
}

现在,NUMPY_IMPORT_ARRAY_RETVAL也是在同一文件__multiarray_api.h中定义的宏。对于python3及更高版本,此宏定义为NULL,否则为空。

#if PY_VERSION_HEX >= 0x03000000
#define NUMPY_IMPORT_ARRAY_RETVAL NULL
#else
#define NUMPY_IMPORT_ARRAY_RETVAL
#endif

应该使用int main函数返回一个整数,但是在扩展的if statement内(如果满足条件_import_array() < 0),对于Python版本,它将返回NULL = 0 (#define NULL 0)或> = 3,因此有效。对于<3的python版本,main函数不返回任何内容,因此会出错。

解决方法(对于python版本<3):

void temp_func() {
    import_array();
}

int main(int argc, char **argv) {
    Py_Initialize();     
    temp_func();

    Py_Finalize(); 
    return 0; 
}

希望,这可以回答问题。