【发布时间】:2017-02-27 09:00:05
【问题描述】:
到目前为止,我已经尝试了互联网上提到的所有解决方案。
我有一个 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 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 来打印 lol,python 将打印:
6.0
但有时仍返回 2 或 18。即使我 printf 并返回相同的变量“lol”。
我尝试了很多东西,但都没有奏效。有人有想法吗?谢谢。
【问题讨论】:
标签: python c python-3.x ctypes