【问题标题】:Calling c functions in python using ctypes使用 ctypes 在 python 中调用 c 函数
【发布时间】:2012-02-10 11:56:06
【问题描述】:

我正在尝试从 python 调用 c 函数,我在 c 中有以下代码。

struct _returndata
{
    double* data;
    int row;
    int col;
};

int mlfAddmatrixW(struct _returndata* retArr)
{
    double data[] = {1,2,3,4,5,6,7,8,9} 
    retArr->row = 3;
    retArr->col = 3;        
    memcpy(retArr->data, data, 9*sizeof(double));            
    return  1;
}

这是我在 python 中的代码:

class RETARRAY(Structure):
    _fields_= [("data", c_double*9),
              ("row", c_int),
            ("col", c_int)]

if __name__ == '__main__':      

    dll = CDLL("/home/robu/Documents/tmo_compile/libmatrix/distrib/libmatrixwrapper.so")    

    #Initializing the matrix 
    retArr = pointer(RETARRAY())

    for i in retArr.contents.data:
        print i;

    dll.mlfAddmatrixW(pointer(retArr))
    for i in retArr.contents.data:
        print i;

    print retArr.contents.row
    print retArr.contents.col

数据的内容发生了变化,但是 col 和 row 仍然是 0。我该如何解决这个问题? 是否可以在 python 中创建一个动态数组,因为在这种情况下,我创建了一个包含 9 个元素 ("data", c_double*9), 的数组。调用mlfAddmatrixW函数后,我知道数组的大小,数组的大小将是col*row

【问题讨论】:

    标签: python c ctypes


    【解决方案1】:

    在 C 和 Python 中有不同的结构:一个有一个指向 double 的指针,另一个有一个 double 数组。尝试类似:

    NineDoubles = c_double * 9
    
    class RETARRAY(Structure):
        _fields_= [("data", POINTER(c_double)),
                  ("row", c_int),
                  ("col", c_int)]
    
    #Initializing the matrix 
    data = NineDoubles()
    retArr = RETARRAY()
    retArr.data = data
    
    dll.mlfAddmatrixW(pointer(retArr))
    

    【讨论】:

    • 最大的问题,就是我不知道python中数组的大小
    • @iUngi 您的 C 函数期望在调用之前已经分配了数组。你能改变C函数吗?
    • 感谢您的帮助。我仍然有 2 个问题,如果在 c 中我在 python 中返回数组return retArr->data; 的地址,我如何才能访问数组的数据?我的另一个问题是上面的代码,在我的问题中,如果我更改 c 中的 row 和 col 字段,在 python 中没有任何影响,这意味着我仍然 0 这个字段的值
    • 我喜欢第一个问题的解决方案:stackoverflow.com/questions/5783761/…
    • 也许你有结构对齐问题?即 C 库的编译器设置与用于构建 ctypes 的编译器设置不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多