当前位置: 首页 > 面试题库 >

在Python中调用C函数

轩辕弘雅
2023-03-14
问题内容

我有很多用C语言编写的函数,我希望我用Python编写的一些代码能够访问这些函数

我已经在这里阅读了几个类似问题的问题,但是我对我应该采用哪种方法感到困惑。

一个问题建议使用ctypes,另一个问题建议使用cython。我已经阅读了两者的文档,但对于哪个对我来说更好,我还是一无所知。

基本上,我已经编写了一些Python代码来进行二维FFT,我希望C代码能够看到该结果,然后通过编写的各种C函数对其进行处理。我不知道从C调用Python是否容易,反之亦然。


问题答案:

如果我理解得很好,您将没有偏好​​使用c => python或类似python =>
c进行对话。在那种情况下,我会推荐Cython。它对多种操作都非常开放,特别是在您的情况下,调用从C用Python编写的函数。

这是它的工作方式(public api):

以下示例假定您有一个Python类(self是它的一个实例),并且该类具有method要在该类上调用并处理C的结果(在此为a
double)的方法(名称)。 ,用编写,Cython extension将有助于您进行此调用。

cdef public api double cy_call_func_double(object self, char* method, bint *error):
    if (hasattr(self, method)):
        error[0] = 0
        return getattr(self, method)();
    else:
        error[0] = 1

在C端,您将可以像下面这样执行调用

PyObject *py_obj = ....
...
if (py_obj) {
    int error;
    double result;
    result = cy_call_func_double(py_obj, (char*)"initSimulation", &error);
    cout << "Do something with the result : " << result << endl;
}

哪里PyObjectstruct提供被Python
/ C API已经抓到后py_obj(通过铸造常规的Python object,在你用Cython扩展这样的:<PyObject *>my_python_object),你将最终能够调用的initSimulation方法就可以了,做什么用的结果。(这里double,但用Cython可以很容易地处理与vectorssets,…)

好吧,我知道,如果您从未使用过任何内容,那么我刚才写的内容可能会造成混淆Cython,但这只是为了简短地展示它在 合并方面
可以为您做的许多事情。

另一方面,取决于算法的复杂性,与将Python代码重新编码为C相比,这种方法可能需要更多的时间。我认为,只有在您计划经常有这种需求时才花时间学习Cython。

希望这至少可以提供信息…



 类似资料:
  • 问题内容: 我正在尝试从C ++实现调用Python函数。我以为可以通过函数指针来实现,但是似乎不可能。我一直在使用以完成此任务。 假设在Python中定义了一个函数: 现在,我需要将此函数传递给C ,以便可以从那里调用它。如何在C 端编写代码以实现此目的? 问题答案: 如果可以使用任何名称: 将其传递给需要一个的函数。 如果它在具有相同名称的单个已知名称空间中: 已定义,因此您可以像调用任何函数

  • 问题内容: 我在AutoIt网站上找不到COM版本。隐藏在某个地方吗?我怎么才能得到它? 问题答案: 在Python中使用AutoIt的方法有两种: pyautoit模块 适用于Windows扩展的python(pywin32) pyautoit模块将使用DLL,而pywin32我们可以使用COM。据我所知,两者之间在功能上没有区别。 先决条件 python的安装。 AutoIt的安装。 pyau

  • 我想知道是否有办法在python代码中使用c函数 例如,在做了我的研究之后,我确实使用. dll文件找到了这个解决方案。但它找不到功能我的代码: 享乐cpp: 使用cmd编译它: g有趣。cpp-o乐趣。动态链接库 使用Python调用函数,ctype: 但是我有这个错误: 回溯(最后一次调用):文件“c:\Users\User.vscode\extensions\ms python.python

  • 问题内容: 我有一个方法,我已经分解成一些较小的嵌套函数来分解代码库: 有没有一种方法可以单独运行其中一个嵌套函数。例如: 编辑: 我正在尝试在使用pyramid_breaker构建的Web服务器上设置缓存 这是我的理解可能不准确: 现在我有这个原因是因为装饰器用来创建缓存键的名称空间是从函数和争论中产生的。因此,您不能仅将装饰器放在getThis上,因为请求变量是唯一的,并且缓存是无用的。所以我

  • 我在nodejs中运行一个python脚本。但是我想保持开放,然后从nodejs调用def函数几次。我怎么能做到这一点。 ################################################################################### 测验派克

  • 问题内容: 我已经在SQL中创建了一个函数,现在我需要在C#应用程序中使用该函数。 我尝试使用类似的方法,但由于得到以下内容,看来我做错了: …当我给出第一个参数和第二个参数时 这是我正在谈论的代码: 我的函数接受两个整数参数并返回一个表。我在Visual Studio中对其进行了检查,并且可以正常工作,但是无法在我的应用程序中正常工作。 这是我的函数声明: 问题答案: 您的SQL有点过时了,应该