从python调用C函数的最佳方法?

时间:2013-04-16 02:46:00

标签: python c

我已经用Python编写了一个高级电机控制器,并且我已经达到了一个点,我想降低一点来获得一些速度,所以我有兴趣用C编码这些位。

我对C没有多少经验,但我正在研究的数学计算非常简单,所以我确信我能用最少量的撞击墙来实现。我不确定的是如何最好地调用这个编译的C程序,以便将它的输出传回我的高级python控制器。

我已经使用了一些ctypes,但只是从manufacfturer提供的DLL中提取一些函数...不确定这是否是在这种情况下适当的路径。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您可以查看本教程here

此外,官方python网站here上的一个更可靠的例子。

例如,

sum.h功能

int sum(int a, int b)

名为module.c

的文件
#include <Python.h>
#include "sum.h"

static PyObject* mod_sum(PyObject *self, PyObject *args)
{
    int a;
    int b;
    int s;
    if (!PyArg_ParseTuple(args,"ii",&a,&b))
       return NULL;
    s = sum(a,b);
    return Py_BuildValue("i",s);
}

static PyMethodDef ModMethods[] = {
    {"sum", mod_sum, METH_VARARGS, "Description.."},
    {NULL,NULL,0,NULL}
};

PyMODINIT_FUNC initmod(void)
{
    PyObject *m;
    m = Py_InitModule("module",ModMethods);
    if (m == NULL)
       return;
}

的Python

import module
s = module.sum(3,5)

答案 1 :(得分:0)

另一种选择:尝试numba。 它可以免费提供类似C的速度:只需输入numba和@autojit你的功能,就可以提高速度。

如果你有复杂的数据类型,它将不起作用,但如果你循环并跳过数组索引,它可能正是你正在寻找的。

答案 2 :(得分:0)

你可以使用SWIG,使用起来非常简单

答案 3 :(得分:0)

您可以使用Cython设置必要的c类型并编译您的python语法代码。