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