【问题标题】:Using a C function in Python在 Python 中使用 C 函数
【发布时间】: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


    【解决方案1】:

    虽然@falsetru 的答案是更好的方法,但另一种方法是简单地编写 C 函数来使用双精度。

    在调用没有参数列表的函数时,浮点数会自动提升为双精度。

    【讨论】:

      【解决方案2】:

      需要指定函数的restypeargtypes

      zelib = ctypes.CDLL('...')
      zelib.multiplier.restype = ctypes.c_float   # return type
      zelib.multiplier.argtypes = [ctypes.c_float, ctypes.c_float]  # argument types
      

      根据Specifying the required argument types (function prototypes)

      可以通过设置argtypes 属性来指定从DLL 导出的函数所需的参数类型。

      Return typesctypes module documentation

      默认情况下,假定函数返回 C int 类型。其他返回类型可以通过设置函数对象的restype属性来指定。


      # without specifying types
      >>> import ctypes
      >>> zelib = ctypes.CDLL('testlib.so')
      >>> zelib.multiplier(2, 3)
      0
      
      # specifying types
      >>> zelib.multiplier.restype = ctypes.c_float
      >>> zelib.multiplier.argtypes = [ctypes.c_float, ctypes.c_float]
      >>> zelib.multiplier(2, 3)
      6.0
      

      【讨论】:

      • 谢谢你,就像一个魅力!实际上我昨天尝试了几次,由于某种原因它没有工作,但现在它可以了。
      • 对不起,双重评论...。在这种情况下,您是否知道如何将 numpy 浮点数组作为输入传递?并在 C 函数中返回一个数组?谢谢。
      • @Nicano,看看这个:docs.scipy.org/doc/numpy/reference/generated/… 如果您有更多问题,请作为另一个问题发布。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2013-02-03
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多