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

时间:2015-09-02 22:10:40

标签: python c

我有一些C代码,它有一些基本功能。我希望能够从我的python代码中调用这些C函数。当我在网上搜索时,似乎有很多方法可以做到这一点,但它们看起来有点复杂。任何人都可以建议哪种方法最简单,最好的方法从python中调用C函数而没有任何问题?

4 个答案:

答案 0 :(得分:2)

Cffi库是一种相当现代的方法。它也适用于python和pypy。

如果您将函数包含在共享库中,则可以将它们作为python方法导入。看看这里的示例:http://cffi.readthedocs.org/en/latest/overview.html

答案 1 :(得分:0)

您可以使用C编译器使用共享库并调用库中定义的函数,对此,您可以使用CPython模块。

答案 2 :(得分:0)

如果要使用某些C函数扩展Python,可以查看以下示例。您需要的是一个为您自己的函数注册包装函数的模块。

有关详细信息,请查看Python docs

#include <Python.h>

static PyObject *
yourfunction(PyObject *self, PyObject *args, PyObject *keywds)
{
    int voltage;
    char *state = "a stiff";
    char *action = "voom";
    char *type = "Norwegian Blue";

    static char *kwlist[] = {"voltage", "state", "action", "type", NULL};

    if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist,
                                     &voltage, &state, &action, &type))
        return NULL;

    printf("-- This parrot wouldn't %s if you put %i Volts through it.\n",
           action, voltage);
    printf("-- Lovely plumage, the %s -- It's %s!\n", type, state);

    Py_INCREF(Py_None);

    return Py_None;
}

static PyMethodDef keywdarg_methods[] = {
    {"yourfunction", (PyCFunction)yourfunction, METH_VARARGS | METH_KEYWORDS,
     "the doc of your function"},
    {NULL, NULL, 0, NULL}   /* sentinel */
};


// in Python 2.x the function name initmodulename is executed when imported
void initkeywdarg(void)
{
  /* Create the module and add the functions */
  Py_InitModule("keywdarg", keywdarg_methods);
}

要编译文件,您可以使用clang。请记住,如果Python标头位于其他位置,则必须更正包含路径。可以使用keywdarg.so创建创建的二进制文件import keywdarg

  

clang ++ -shared -I / usr / include / python2.7 -fPIC keywdarg.cpp -o keywdarg.so -lpython

答案 3 :(得分:-1)

假设你的c代码发送电子邮件,代码接受这样的args

./sendemail email title body

然后从python中,您可以执行以下操作:

from subprocess import call
call(["./sendemail", "email@email.com", "subject", "body"])