python 调用c函数

Python调用c

一个典型的Python扩展模块至少应该包含三个部分:导出函数、方法列表和初始化函数。 例子:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

example.c

int fact(int n)

{

        if (n <= 1)

        return 1;

        else

        return n * fact(n - 1);

}

wrap.c

#include <Python.h>

PyObject* wrap_fact(PyObject* self, PyObject* args)

{

        int n, result;

        

        if (! PyArg_ParseTuple(args, "i:fact", &n))

        return NULL;

        result = fact(n);

        return Py_BuildValue("i", result);

}

static PyMethodDef exampleMethods[] =

{

        {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

        {NULL, NULL}

};

void initexample()

{

        PyObject* m;

        m = Py_InitModule("example", exampleMethods);

}

1. 导出函数 要在Python解释器中使用C语言中的某个函数,首先要为其编写相应的导出函数,上述例子中的导出函数为wrap_fact。在Python的C语言扩展中,所有的导出函数都具有相同的函数原型:


1

PyObject* method(PyObject* self, PyObject* args);

该函数是Python解释器和C函数进行交互的接口,带有两个参数:self和args。参数self只在C函数被实现为内联方法(built-in method)时才被用到,通常该参数的值为空(NULL)。参数args中包含了Python解释器要传递给C函数的所有参数,通常使用Python的C语言扩展接口提供的函数PyArg_ParseTuple()来获得这些参数值。 所有的导出函数都返回一个PyObject指针,如果对应的C函数没有真正的返回值(即返回值类型为void),则应返回一个全局的None对象(Py_None),并将其引用计数增1,如下所示:


1

2

3

4

5

PyObject* method(PyObject *self, PyObject *args)

{

        Py_INCREF(Py_None);

        return Py_None;

}

2. 方法列表 方法列表中给出了所有可以被Python解释器使用的方法,上述例子对应的方法列表为:


1

2

3

4

5

static PyMethodDef exampleMethods[] =

{

        {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

        {NULL, NULL}

};

方法列表中的每项由四个部分组成:方法名、导出函数、参数传递方式和方法描述。方法名是从Python解释器中调用该方法时所使用的名字。参数传递方式则规定了Python向C函数传递参数的具体形式,可选的两种方式是METH_VARARGS和METH_KEYWORDS,其中METH_VARARGS是参数传递的标准形式,它通过Python的元组在Python解释器和C函数之间传递参数,若采用METH_KEYWORD方式,则Python解释器和C函数之间将通过Python的字典类型在两者之间进行参数传递。

3. 初始化函数 所有的Python扩展模块都必须要有一个初始化函数,以便Python解释器能够对模块进行正确的初始化。Python解释器规定所有的初始化函数的函数名都必须以init开头,并加上模块的名字。对于模块example来说,则相应的初始化函数为:


1

2

3

4

5

void initexample()

{

        PyObject* m;

        m = Py_InitModule("example", exampleMethods);

}

当Python解释器需要导入该模块时,将根据该模块的名称查找相应的初始化函数,一旦找到则调用该函数进行相应的初始化工作,初始化函数则通过调用Python的C语言扩展接口所提供的函数Py_InitModule(),来向Python解释器注册该模块中所有可以用到的方法。

4. 编译 在linux下,编译成so库,python可以直接import。windows下,需要将dll的后缀修改成pyd,python才能识别。


1

2

3

4

5

gcc -fpic -c -I/usr/include/python2.5 \

-I /usr/lib/python2.5/config \

example.c wrapper.c

gcc -shared -o example.so example.o wrapper.o

5. python调用


1

2

3

4

>>> import example

>>> example.fact(4)

24

>>>

时间: 2024-10-23 13:52:17

python 调用c函数的相关文章

项目记录 -- python调用回调函数

C源文件: 1 static int 2 get_callback(zpool_handle_t *zhp, void *data) 3 { 4 zprop_get_cbdata_t *cbp = (zprop_get_cbdata_t *)data; 5 char value[MAXNAMELEN]; 6 zprop_source_t srctype; 7 zprop_list_t *pl; 8 9 for (pl = cbp->cb_proplist; pl != NULL; pl = pl

【转】Python调用C函数

原文链接: Python调用C函数 – 快课网http://www.cricode.com/359.html 关键字:Python ctypes,Python调用dll,Python调用C函数为了节省软件开发成本,软件开发人员希望能够缩短的软件的开 发时间,希望能够在短时间内开发出稳定的产品.Python 功能强大,简单易用,能够快速开发应用软件.但是由于 Python 自身执行速度的局限性,对性能要求比较高的模块需要使用效率更高的程序语言进行开发,例如 C 语言,系统的其他模块运用 Pytho

python调用C函数

是的,我又开始integrate另一个方法~~ 此方法用C++,Python作胶水,供Matlab调用,原来是在Linux上编译运行,我需要把它在Windows x64上跑起来~~ 在Linux平台,Python调用C是通过这样的方式来进行的: var = CDLL('test.so') 其中,.so是Linux上的一种称为共享库的文件,类似于Windows的.dll文件.那么想当然的,在Windows下面要想调用,我们需要把后面的这个文件替换成test.dll. 这个步骤也不难,方法就是在需要

python调用php函数

由于php不支持多线程,所以想借助python搞一个.1.import subprocessimport time#Simple caller, disguard outputmethod="diao"for i in range(2):time1=time.time()#print i#subprocess.call("php h.php")proc = subprocess.Popen("php h.php " + method, shell

利用Python 调用turtle函数库 绘制奥运五环。

import turtle #调用turtle库绘制图像的函数库turtle.color("blue") #颜色 蓝色turtle.circle(100) #画半径100的圆 turtle.penup() #抬起笔turtle.goto(-180,0) #移动到turtle.pendown() #放笔turtle.color("red") #颜色 红色turtle.circle(100) #画半径100的圆 turtle.penup() #提起笔turtle.got

Python调用dll

Python的运行效率并不高,不过我们可以通用调用c函数或者dll来提高效率. 下面简单的写一个dll: MyDll.h 1 #ifndef MYDLL 2 #define MYDLL 3 #ifdef MY_DLL 4 #define MY_DLL extern "C" _declspec(dllimport) 5 #else 6 #define MY_DLL extern "C" _declspec(dllexport) 7 #endif 8 9 MY_DLL

#python#子类调用父类函数的方法

Python中的子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数. 如下例程里,???处是需要调用父类函数的地方,接下来结合例程具体介绍. 1 1 # -*- coding:utf-8 -*- 2 2 class Student: 3 3 def __init__(self,name): 4 4 self.name=name 5 5 def ps(self): 6 6 print('I am %s'%self.name) 7 7 8 8 class Scor

python 调用函数

Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://docs.python.org/2/library/functions.html#abs 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息. 调用abs函数: >>> abs(100) 100 >>> abs(-20) 20 >>> abs(1

Python调用C++DLL函数出错String类型问题

调用c++ 函数原型如下,一直失败,请个日志断点发现 参数未能正确解析. int EXPORT init_ner(string cfg_path); typedef int (*Proc_init_ner)(string cfg_path); int EXPORT fini_ner(); typedef int (*Proc_fini_ner)(); string EXPORT process(string input_jsn_str); typedef string (*Proc_proces