从Python访问cython包装的C代码中的C数组

从Python访问cython包装的C代码中的C数组,cython,Cython,我已经成功地用Cython包装了C库的一些api函数。我现在想公开库中使用的一些全局C数组,但我很难弄清楚如何做到这一点 数组指针在epanet.c内初始化和分配: void initpointers() { H = NULL; } int allocdata() { n = MaxNodes + 1; H = (double *) calloc(n, sizeof(double)); } 它在头文件(vars.h)中成为全局文件: 当然,我可以在C代码中访问数组

我已经成功地用Cython包装了C库的一些api函数。我现在想公开库中使用的一些全局C数组,但我很难弄清楚如何做到这一点

数组指针在epanet.c内初始化和分配:

void initpointers()
{
    H = NULL;
}

int  allocdata()
{
    n = MaxNodes + 1; 
    H = (double *) calloc(n, sizeof(double));
}
它在头文件(vars.h)中成为全局文件:

当然,我可以在C代码中访问数组中的值,方法如下:

for (i=1; i<=Nnodes; i++)
{
    H[i] = some_value;
}

但是,我缺少C和cython/python之间的必要联系。我一直在寻找答案,但运气不好。请帮忙。

我终于找到了有效的方法。似乎我可以声明指针而不引用头文件。当我以前试图引用头文件时,我认为由于重新定义了项,我得到了错误。下面是我的.pyx文件中现在可以使用的代码:

cdef:
    extern double *H
    extern int Nnodes

def printH():
    cdef int i
    for i in range(1,Nnodes+1):
        print round(H[i], 2)

我终于找到了有效的方法。似乎我可以声明指针而不引用头文件。当我以前试图引用头文件时,我认为由于重新定义了项,我得到了错误。下面是我的.pyx文件中现在可以使用的代码:

cdef:
    extern double *H
    extern int Nnodes

def printH():
    cdef int i
    for i in range(1,Nnodes+1):
        print round(H[i], 2)

关于Cython MemoryView的这一页可能会有所帮助:我已经读了好几遍了,但我仍然不知道该怎么做。我也读过库尔特·史密斯的《赛顿》一书的大部分内容。我就是找不到适合我的包装C代码的正确例子。你读过吗?您是否只需要pyx文件中的“vars.h”:\n double*h中的
cdef extern?@DavidW,谢谢您的评论。我现在遇到另一个我正在处理的错误。如果您的评论解决了我的问题,我会告诉您。我使用了:
cdefextern from“lib/vars.h”:double*h
,正如您所说。我现在遇到了一个错误:无法将Python对象参数转换为第行的'double*'类型:
def printH(int Nnodes,double*H):
Cython MemoryView上的这一页可能会有所帮助:我已经读了好几遍了,但我仍然不确定如何做。我也读过库尔特·史密斯的《赛顿》一书的大部分内容。我就是找不到适合我的包装C代码的正确例子。你读过吗?您是否只需要pyx文件中的“vars.h”:\n double*h
中的
cdef extern?@DavidW,谢谢您的评论。我现在遇到另一个我正在处理的错误。如果您的评论解决了我的问题,我会告诉您。我使用了:
cdefextern from“lib/vars.h”:double*h
,正如您所说。我现在遇到了一个错误:无法将Python对象参数转换为第行的“double*”类型:
def printH(int Nnodes,double*H):
cdef:
    extern double *H
    extern int Nnodes

def printH():
    cdef int i
    for i in range(1,Nnodes+1):
        print round(H[i], 2)