从python3 C扩展返回一个数组

问题描述 投票:1回答:1

我希望在C扩展模块中生成数组并将它们传递回python。

以下代码适用于python2:

C_generate_array.c:

#include "Python.h"
#include "arrayobject.h"
#include "C_generate_array.h"
#include <assert.h>

static PyMethodDef C_generate_arrayMethods[] = {
    {"get_array", get_array, METH_VARARGS},
    {NULL, NULL}     /* Sentinel - marks the end of this structure */
};

#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef cModPyDem =
{
    PyModuleDef_HEAD_INIT,
    "C_generate_array", /* name of module */
    "",          /* module documentation, may be NULL */
    -1,          /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
    C_generate_arrayMethods
};
PyMODINIT_FUNC PyInit_C_generate_array(void)
{
    return PyModule_Create(&cModPyDem);
}
#else
void initC_generate_array()  {
    (void) Py_InitModule("C_generate_array", C_generate_arrayMethods);
    import_array();  // Must be present for NumPy.  Called first after above line.
}
#endif

static PyObject *get_array(PyObject *self, PyObject *args)
{
    int dims[2];
    dims[0]=dims[1]=2;
    PyArrayObject *matout;
#if PY_MAJOR_VERSION >= 3
    //what to do here?
    return PyLong_FromLong(1);
#else
    matout = (PyArrayObject *) PyArray_FromDims(2,dims,NPY_DOUBLE);
    return PyArray_Return(matout);
#endif
}

C_generate_array.h:

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION

#if PY_MAJOR_VERSION >= 3
#define IS_PY3K
#endif

typedef int bool;
#define true 1
#define false 0


static PyObject *get_array(PyObject *self, PyObject *args);

C_generate_array_setup.朋友:

from distutils.core import setup, Extension
module1 = Extension('C_generate_array',
                    include_dirs = ['path_to_python/lib/python3.5/','path_to_python/lib/python3.5/site-packages/numpy/core/include/numpy/'],
                    sources = ['C_generate_array.c'])
setup (name = 'C_generate_array',
       version = '1.0',
       description = 'Example',
       ext_modules = [module1])

然后建立和安装:

>sudo python2.7 C_generate_array_setup.py build
>sudo python2.7 C_generate_array_setup.py install
>python2.7
>>> import C_generate_array
>>> C_generate_array.get_array()
array([[0., 0.],
       [0., 0.]])

但是,对于python3来说,这相当于什么呢?我只找到了一种返回标量变量的方法:

>sudo python3.5 C_generate_array_setup.py build
>sudo python3.5 C_generate_array_setup.py install
>python3.5
>>> import C_generate_array
>>> C_generate_array.get_array()
1

我怎样才能返回数组?

python-3.x python-c-api
1个回答
0
投票

我认为问题是PyArray_FromDims是一个非常旧的API函数,不再推荐使用,可能已经从Numpy标题中删除了。我不知道为什么它似乎适用于Python 2,但你可能在那里安装了旧版本的Numpy。

我建议你改用PyArray_ZEROS,它有一个基本相同的接口和一个额外的参数来标记数组是否应该是Fortran连续的(你可能想把它设置为0)。如果你想将数组填充到零以外的其他东西,那么选择一个不同的函数(阅读我已链接的文档)。

© www.soinside.com 2019 - 2024. All rights reserved.