Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编译多个模块时,import_array()出现Numpy/CAPI错误 我试图编译一个C++模块,用于在代码> SimP.Weave中,它由几个头和源C++文件组成。这些文件包含广泛使用Numpy/C-API接口的类和方法。但是我没有弄清楚如何成功地包含import\u array()。在过去的一周里,我一直在努力解决这个问题,我快发疯了。我希望你能帮我,因为weave的解释性不强_Python_C++_C_Numpy_Python C Api - Fatal编程技术网

Python 编译多个模块时,import_array()出现Numpy/CAPI错误 我试图编译一个C++模块,用于在代码> SimP.Weave中,它由几个头和源C++文件组成。这些文件包含广泛使用Numpy/C-API接口的类和方法。但是我没有弄清楚如何成功地包含import\u array()。在过去的一周里,我一直在努力解决这个问题,我快发疯了。我希望你能帮我,因为weave的解释性不强

Python 编译多个模块时,import_array()出现Numpy/CAPI错误 我试图编译一个C++模块,用于在代码> SimP.Weave中,它由几个头和源C++文件组成。这些文件包含广泛使用Numpy/C-API接口的类和方法。但是我没有弄清楚如何成功地包含import\u array()。在过去的一周里,我一直在努力解决这个问题,我快发疯了。我希望你能帮我,因为weave的解释性不强,python,c++,c,numpy,python-c-api,Python,C++,C,Numpy,Python C Api,实际上,我首先有一个名为pycapi_utils的模块,其中包含一些用于将C对象与Python对象进行接口的例程。它由头文件pycapi_utils.h和源文件pycapi_utils.cpp组成,例如: //pycapi_utils.h #if ! defined _PYCAPI_UTILS_H #define _PYCAPI_UTILS_H 1 #include <stdlib.h> #include <Python.h> #include <numpy/ar

实际上,我首先有一个名为
pycapi_utils
的模块,其中包含一些用于将C对象与Python对象进行接口的例程。它由头文件
pycapi_utils.h
和源文件
pycapi_utils.cpp
组成,例如:

//pycapi_utils.h
#if ! defined _PYCAPI_UTILS_H
#define _PYCAPI_UTILS_H 1

#include <stdlib.h>
#include <Python.h>
#include <numpy/arrayobject.h>
#include <tuple>
#include <list>

typedef std::tuple<const char*,PyObject*> pykeyval; //Tuple type (string,Pyobj*) as dictionary entry (key,val)
typedef std::list<pykeyval> kvlist;                    

//Declaration of methods
PyObject* array_double_to_pyobj(double* v_c, long int NUMEL); //Convert from array to Python list (double)
...
...
#endif

上面的代码包含在Python中的
scipy.weave
模块中

def model_py(input):
    support_code="""
                 #include "model.h"
                 """
    code = """
           return_val = simulate(input.data());
           """
    libs=['gsl','gslcblas','m']
    vars = ['input']
    out = weave.inline(code,
                       vars,
                       support_code=support_code,
                       sources = source_files,
                       libraries=libs
                       type_converters=converters.blitz,
                       compiler='gcc',
                       extra_compile_args=['-std=c++11'],
                       force=1) 
它无法编译以下内容:

error: int _import_array() was not declared in this scope
值得注意的是,如果我把
pycapi_utils.h
和源代码
pycapi_utils.cpp
结合起来,那么一切都很好。但是我不想使用这个解决方案,因为在实践中,我这里的模块需要包含在其他几个也使用PyObjects的模块中,并且需要调用
import\u array()


我一直在寻找堆栈交换,但我不知道在我的例子中是否以及如何正确定义
#define
指令。同样,那篇文章中的例子也不完全是我的例子,
import\u array()
main()
的全局范围内调用,而在我的例子中,
import\u array()
simulate
例程中调用,该例程由
main()调用
buildby
scipy.weave
显然,如果我在
pycapi\u utils
模块中包含一个简单的初始化例程,例如:

//pycapi_utils.h
...
...
void init_numpy();

//pycapi_utils.cpp
...
...
void init_numpy(){
    Py_Initialize;
    import_array();
}
然后我在任何在我的C代码中使用Numpy对象的函数/方法的开头调用这个例程,它就可以工作了。即,将上述代码编辑为:

//pycapi_utils.cpp
...
...
PyObject* array_double_to_pyobj(...){
    init_numpy();
    ...
    ...
}


//model.cpp
...
...
PyObject* simulate(...){
    init_numpy();
    ...
    ...
}

在这一点上,我唯一关心的是是否有一种方法可以最大限度地减少对
init\u numpy()
的调用次数,或者不管我必须从使用numpy对象的CPP模块中定义的任何函数中调用它

我有一个类似的问题,正如您发布的链接所指出的,所有问题的根源在于
PyArray\u API
是静态定义的,这意味着每个翻译单元都有自己的
PyArray\u API
,默认情况下使用
PyArray\u API=NULL
初始化。因此,必须为每个
*.cpp
文件调用一次
import\u array()。在您的情况下,在
pycapi_utils.cpp
中调用它,以及在
model.cpp
中调用一次就足够了。您还可以在实际调用之前测试是否需要数组_导入:

if(PyArray_API == NULL)
{
    import_array(); 
}

刚刚偶然发现这个问题的解决方案有很好的文档记录,您提供的链接是否提倡使用与您不同的解决方案?1)
import_array
仅在一个文件中,2)在该文件和其他文件中使用
定义PY_array_UNIQUE_符号,3)在不使用
import_array
的文件中使用
定义NO_import_array
//pycapi_utils.h
...
...
void init_numpy();

//pycapi_utils.cpp
...
...
void init_numpy(){
    Py_Initialize;
    import_array();
}
//pycapi_utils.cpp
...
...
PyObject* array_double_to_pyobj(...){
    init_numpy();
    ...
    ...
}


//model.cpp
...
...
PyObject* simulate(...){
    init_numpy();
    ...
    ...
}
if(PyArray_API == NULL)
{
    import_array(); 
}