python调用C函数库

python 调用指定位置的第三方库 如何在python中调用库函数_python

(2012-10-31 13:47:50)



背景:工作中,有很多公共类库是使用C语言实现的。虽然可以将之编译成可执行的二进制文件,使用已熟知的commands模块获取shell命令行返回的结果;但是有些时候,所传的参数中含有shell命令中需要转义的字符(如,“$”),因此想到使用python直接调用C语言的函数库,省去了对字符串中特殊字符进行转义的麻烦。

.so文件的生成与使用

-shared”命令。

为了检测生成的.so文件的可用性,可以编写简单的C语言测试代码,常用的函数有:

//打开动态链接库,并赋值给handle句柄,供后续使用
dlsym(handle, "func_name");           
 dlclose(handle); //通过句柄关闭动态链接库

ctypes模块简介

python中,ctypes模块可以加载动态链接库,使用时,需要首先“from ctypes import *”。

常用的函数有:

#加载.so动态链接库

                     #调用动态链接库中的函数

另,因python与C语言中的数据类型不同,对于string类型,在调用C链接库中的函数时,需要使用“c_char_p”对将字符串转换为标准C中的char*类型。

注:ctypes不支持C++的数据类型(如,C++中的string等)。

附,python和C数据类型对照表:

python 调用指定位置的第三方库 如何在python中调用库函数_python 调用指定位置的第三方库_02

实例

1、首先创建一个具有标准C数据类型的参数和返回值的函数(函数体中可以包含C++数据类型的元素)。

   为了避免C编译器修改函数的名字,使用extern "C" 来声明函数,如,

python 调用指定位置的第三方库 如何在python中调用库函数_python_03

   

2、因python调用so动态链接库出core时不便于调试,在生成so文件后,首先编写一个简单的test.c来检测生成的.so文件的可用性:

python 调用指定位置的第三方库 如何在python中调用库函数_python 调用指定位置的第三方库_04

3、编写python脚本调用动态链接库:

python 调用指定位置的第三方库 如何在python中调用库函数_so文件_05