从Python访问cython包装的C代码中的C数组
我已经成功地用Cython包装了C库的一些api函数。我现在想公开库中使用的一些全局C数组,但我很难弄清楚如何做到这一点 数组指针在epanet.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代码中访问数组
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)