【问题标题】:Wrong return value from c function wrapped in python来自 python 中的 c 函数的错误返回值
【发布时间】:2021-05-23 07:39:52
【问题描述】:

这很奇怪,我试图包装一个我用 c 编写的函数以便在 python 中使用它,为了了解如何做到这一点,我做了一个例子:

cfunctions.c:

double dotproduct(int dim, double a[dim], double b[dim]){
    double res = 0;
    for(int i = 0; i < dim; i++){
        res = res + a[i]*b[i];
    }
    return res;
}

py_cfunctions.py:

from ctypes import *
import numpy as np

# so_file genreated with:
# cc -fPIC -shared -o cfunctions.so cfunctions.c
so_file = 'MY_PATH/cfunctions.so'
py_cfunctions = CDLL(so_file)
c_double_p = POINTER(c_double)
# Preparing example

def dotproduct(n,a,b):
    # Convert np.array to ctype doubles
    a_data = a.astype(np.double)
    a_data_p = a_data.ctypes.data_as(c_double_p)
    b_data = b.astype(np.double)
    b_data_p = b_data.ctypes.data_as(c_double_p)
    # Compute result...
    c_return = py_cfunctions.dotproduct(n,a_data_p,b_data_p)
    if (c_return != -1):
        return c_return
    else:
        return "C Function failed, check inputs"
 
py_cfunctions.dotproduct.argtypes= [c_int, c_double_p, c_double_p] 

有趣的是,代码似乎可以工作,但返回值总是等于n。如果我在返回之前尝试打印res,我可以看到该值是正确的,但实际返回的值始终是n。我错过了什么?

>>> import py_cfunctions as pycf
>>> import numpy as np
>>> a = np.array([1,2,3,4])
>>> b = np.array([4,5,6,1])
>>> pycf.dotproduct(4,a,b)
4

【问题讨论】:

  • 设置pycf.dotproduct.restype = c_double
  • @MarkTolonen 是的!现在它确实有效,你能解释一下为什么在这种情况下我应该明确定义返回类型吗? (我见过一些例子,例如 factorial 函数,它在没有重新样式定义的情况下运行良好。
  • 在实现级别,整数在不同于浮点值的寄存器中返回。 ctypes 假定 c_int 作为返回值,除非另有说明。使用ctypes 时,“显式优于隐式”。 始终正确定义 .restype.argtypes,您会遇到更少的问题。
  • 好的,谢谢!我会回答我自己的问题并引用你。

标签: python c numpy ctypes cpython


【解决方案1】:

感谢@Mark Tolonen 的回答:

“在实现级别,整数在与浮点值不同的寄存器中返回。ctypes 假定 c_int 作为返回值,除非另有说明。使用 ctypes 时,'显式优于隐式'。始终正确定义 .restype 和 .argtypes你会遇到更少的问题。”

我必须明确定义我的函数的返回类型,将以下行添加到pic_functions.py

py_cfunctions.dotproduct.restype = c_double

【讨论】:

    猜你喜欢
    • 2015-12-28
    • 2021-03-02
    • 2019-05-02
    • 1970-01-01
    • 2023-03-08
    • 2016-04-13
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多