python调用C函数库

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

转载
标签:

动态链接库

c语言

so

ctypes

python

分类:Python

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

.so文件的生成与使用

想要使用python调用C语言的函数,必须先将C程序编译生成.so文件。生成.so文件需要使用“gcc -shared”命令。

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

void* handle = dlopen("xxx.so", RTLD_LAZY);   //打开动态链接库,并赋值给handle句柄,供后续使用

myfunc = dlsym(handle, "func_name");            //获取动态链接库中的函数指针

dlclose(handle); //通过句柄关闭动态链接库

ctypes模块简介

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

常用的函数有:

libc = cdll.LoadLibrary("xxx.so")  #加载.so动态链接库

libc.myfunc(...)                        #调用动态链接库中的函数

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

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

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

实例

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

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

使用“nmxxx.so”命令可以查看xxx.so中的函数列表。

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

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

python调用C函数库相关推荐

  1. linux 下的动态库制作 以及在python 中如何调用 c 函数库

    linux 下的动态库制作 以及在python 中如何调用 c 函数库 动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序 ...

  2. python中调用π的值_python如何调用math函数库求π值

    python如何调用math函数库求π值 发布时间:2020-11-25 09:41:21 来源:亿速云 阅读:103 作者:小新 小编给大家分享一下python如何调用math函数库求π值,相信大部 ...

  3. python调用dll函数指针_python使用ctypes库调用DLL动态链接库

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  4. python调用c++动态库 linux_linux中使用boost.python调用c++动态库的方法

    前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot ...

  5. python调用c语言函数_从Python调用C函数

    python调用c语言函数 We can call a C function from Python program using the ctypes module. 我们可以使用ctypes模块从P ...

  6. 一文读懂如何用python调用matlab函数(windows环境)

    第一步配置环境: 要安装引擎 API,请在操作系统提示符下执行以下命令,其中 matlabroot 是 MATLAB 文件夹的路径.您可能需要管理员权限才能执行这些命令.或者,使用在非默认位置安装用于 ...

  7. Python调用C++ DLL库 ------OSError: [WinError 126] 找不到指定的模块。

    Python调用C++ DLL库 解决Python中 OSError: [WinError 126] 找不到指定的模块 的问题. 一.问题:   在进行Python开发的过程中,很可能遇到调用C++ ...

  8. python 调用 javascript函数

    python 调用 javascript函数 # pip install pyexecjs import execjs # 直接执行 print('execjs.eval:', execjs.eval ...

  9. python调用.net动态库

    # python调用.net动态库 ### pythonnet简介 ----------------------------- - pythonnet是cpython的扩展 - pythonnet提供 ...

最新文章

  1. 输入框中默认的值,判断是否输入内容
  2. 西瓜书学习记录-绪论
  3. 2014-07-28 使用Axure RP进行手机端BBS的原型设计
  4. 深入V8引擎-Time核心方法之mac篇
  5. jsp中9个隐藏对象
  6. Ubuntu18.04安装“迅雷“
  7. flash 转 html5 工具_转
  8. java 取模运算_JAVA算术运算符_四则与取模
  9. python清华大学出版社答案_Python机器学习及实践
  10. excel转置怎么操作_Excel选择性粘贴,那些你不得不会的小技巧
  11. BZOJ[2827]千山鸟飞绝 线段树
  12. 绘画板绘-小白画线不稳怎么办?
  13. 余世维成功经理人讲座
  14. python绘图篮球_用Python把NBA球员投篮数据可视化
  15. 3万字智慧工业园区整体解决方案
  16. 【shell】shell 函数
  17. Kafka 消息可靠性
  18. Java实现二分法排序
  19. 苹果笔记本桌面下面的工具栏没了怎么调出来
  20. JavaScript中常见键盘事件以及BOM中window常用对象

热门文章

  1. self studying room list available at campus
  2. 免费OA系统品牌有那些?
  3. randomaccessfile在移动设备多线程多服务器下载时写入慢的问题
  4. JAVA截取字符串方法
  5. Django 1.10中更新modules同步数据库
  6. 由浅到深讲解C#-LINQ
  7. Quartz 2d绘图
  8. UML学习总结(1)——UML学习入门
  9. 务实云计算培训:帮您顺利走好云之旅
  10. Application Architecture Guide 2.0 (Chapter 7: Quality Attributes) Part 3