在Python中使用C函数

尼卡诺

到目前为止,我已经尝试了互联网上提到的所有解决方案,但对我来说却无济于事。

我有一个python代码,为了加快速度,我希望我的代码在C函数中运行大量计算。我已经写了这个C函数。

然后,要共享库,我在终端上完成了此操作:

gcc -shared -Wl,-install_name,testlib.so -o testlib.so -fPIC myModule.c

不会返回任何错误。问题; 当我尝试在python中启动C函数时出现。让我们考虑一下C中的以下简单函数:

int multiplier(int a, int b)
{

int lol = 0;

lol = a*b;

return lol;
}

我启动python3(3.5.2),然后:

import ctypes
zelib = ctypes.CDLL("/Users/longeard/Desktop/Codes/DraII/testlib.so",ctypes.RTLD_GLOBAL)

该库应该可以通过以下方式在python中使用:

res = zelib.multiplier(2,3)

这样做时,它会工作并且python返回

6

问题是,我要使用的函数(我使用的乘数函数仅作为示例)应该将浮点数作为输入并返回浮点数。但是,如果我现在考虑与以前相同的乘数函数,但使用float:

float multiplier(float a, float b)
{

float lol = 0.0;

lol = a*b;

return lol;
}

我使用gcc重新编译,重新导入ctypes并重新执行ctypes.CDLL,而我在python3中这样做:

zelib.multiplier(ctypes.c_float(2),ctypes.c_float(3))

(这里的types.c_float将python中的2转换为C中的float),python将返回:

2

这很奇怪,因为如果我在函数中添加printf来打印大声笑,python将会打印:

  6.0

但仍然返回2,有时还是18。即使我printf并返回相同的变量“大声笑”。

我尝试了很多事情,但都无济于事。请问有人有主意吗?谢谢。

勒兰斯兰

尽管@falsetru的答案是更好的解决方法,但是另一种方法是简单地编写C函数以使用double。

调用不带参数列表的函数时,浮点数会自动提升为两倍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章