【转】Python调用C函数

原文链接:

Python调用C函数 – 快课网
http://www.cricode.com/359.html

关键字:Python ctypes,Python调用dll,Python调用C函数
为了节省软件开发成本,软件开发人员希望能够缩短的软件的开 发时间,希望能够在短时间内开发出稳定的产品。Python 功能强大,简单易用,能够快速开发应用软件。但是由于 Python 自身执行速度的局限性,对性能要求比较高的模块需要使用效率更高的程序语言进行开发,例如 C 语言,系统的其他模块运用 Python 进行快速开发,最后将 C 语言开发的模块与 Python 开发的模块进行整合。在此背景下,基于 Python 语言与 C 语言的各自特点,用 C 语言来扩展现有的 Python 程序,显得很有意义。
本文提供Python以链接库的形式调用C函数的实例。主要用到Python提供的ctypes实现。Python官方教程地址:Ctypes

范例一:Python 调用 C 语言 so
第一步:编写C函数,testlib.c

#include <stdio.h>
void myprint()
{
  printf("hello,www.cricode.com!n");
}
第二步:将C函数编译成链接库

$ gcc -shared -Wl,-soname,testlib -o testlib.so -fPIC testlib.c
如果在Mac OS X ,则
$ gcc -shared -Wl,-install_name,testlib.so -o testlib.so -fPIC testlib.c
第三步:在python中使用C链接库函数,编写python代码test.py如下

import ctypes

testlib = ctypes.CDLL(‘/path/to/testlib.so‘)
testlib.myprint()

第四步:just run it

$ python test.py
hello,www.cricode.com!

范例二:参数类型为字符串(即传指针)
当C函数中,参数类型为字符串时,使用ctypes提供的create_string_buffer来创建缓存区。

第一步:编写C函数testlib1.c

#include <string.h>
int reverse(char* str)
{
int i,j,t;
for(i=0,j=strlen(str) - 1;i<j;i++,j--){
t = str[i];
str[i] = str[j];
str[j] = t;
}
return 0;
}
第二步:将C函数编译成链接库

$ gcc -shared -Wl,-soname,testlib1 -o testlib1.so -fPIC testlib1.c

第三步:在python中使用C链接库函数,编写python代码test1.py如下:

import ctypes

s0 = ‘hello,www.cricode.com‘
s1 = ctypes.create_string_buffer(s0)
testlib1 = ctypes.CDLL(‘./testlib1.so‘)
testlib1.reverse(s0)
print ‘s0 is: ‘,s0
print ‘s1 is: ‘,s1.value
第四步:just run it

$ python test1.py
s0 is: moc.edocirc.www,olleh
s1 is: hello,www.cricode.com

范例三:参数为指针、数组(传指针、数组)
第一步:编写C函数testlib2.c

void arrayFunc(int *sum,int arr[4])
{
*sum = arr[0]+ arr[1]*2 + arr[2]*3 + arr[3]*4;
}
第二步:将C函数编译成链接库

$ gcc -shared -Wl,-soname,testlib2 -o testlib2.so -fPIC testlib2.c

第三步:在python中使用C链接库函数,

import ctypes

result = ctypes.c_int()
array = ctypes.c_int*4
parray = array(ctypes.c_int(1),ctypes.c_int(2),ctypes.c_int(3),ctypes.c_int(4))

testlib2 = ctypes.CDLL(‘./testlib2.so‘)
#testlib2.arrayFunc.argtypes=[ctypes.c_void_p,ctypes.c_int*4]
testlib2.arrayFunc(ctypes.pointer(result),parray)
print ‘result is:‘,result.value
第四步:just run it

$ python test2.py
result is: 17

范例四 参数为结构体
第一步:编写C函数testlib3.c

编写python代码test2.py如下:

typedef struct{
int x;
int y;
}mystruct;
mystruct structFunc(mystruct a,mystruct b)
{
mystruct s;
s.x = a.x + b.x;
s.y = a.y + b.y;
return s;
}

第二步:将C函数编译成链接库

$ gcc -shared -Wl,-soname,testlib3 -o testlib3.so -fPIC testlib3.c

第三步:在python中使用C链接库函数,编写python代码test3.py如下:

import ctypes

class mystruct(ctypes.Structure):
_fields_ = [("x",ctypes.c_int),
("y",ctypes.c_int)]

a = mystruct(2,4)
b = mystruct(4,6)
testlib3 = ctypes.CDLL(‘./testlib3.so‘)
#srestype muste be setted to avoid segment fault
testlib3.structFunc.restype = mystruct
c = testlib3.structFunc(a,b)
print c.x,c.y
第四步:just run it

$ python test3.py
6 10
范例五 回调函数的使用
回调函数是什么?

回调函数是由你自己定义,但你永远也不会调用它的一类函数的总称。

【也就是说,你是活雷锋,你在给别人做嫁衣】

continue….

时间: 2024-10-14 08:09:34

【转】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函数

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

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); }

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