from ctypes import cdll
lib = cdll.LoadLibrary('/home/zhengli/test/test.so')
lib.func()

总结:

1、引用ctypes库中的cdll类。

2、利用cdll的LoadLibrary方法加载so包,生成对象。

3、利用对象执行so包的可执行方法。

注意:

1、最好以绝对路径加载so包,相对路径不好控制。

2、编写so包时候,要将发布的功能用  extern "C" {} 框起来。

3、编译参数:

(1) 在编译.o文件时:g++ -c -fPIC *.cpp -o *.o。注意“-fPIC”参数一定要有;

(2) 在编译.so文件时:g++ -shared -Wl -o *.o *

4、如果python在调用C函数内部出现了问题,系统不会提示具体出现什么问题,只会提示"segmentation fault"。所以最好是先用C语言调用该动态库验证没有问题了再提供给python调用。

5、python传参给C函数时,可能会因为python传入实参与C函数形参类型不一致会出现问题( 一般int, string不会有问题,float要注意 )。这时需要在python调用时传入的实参做一个类型转换(见so.add(float, float)函数的调用)。转换方式见下表:

6、如果将python中list传入C函数数组,则需要提前转换。
import ctypes
pyarray = [12345]
carrary = (ctypes.c_int * len(pyarray))(*pyarray) //有点类似malloc的方式生成carray
print so.sum_array(carray, len(pyarray))

7、如何调用C++中的类

因为python不能直接调用C++中的类,所以必须把C++中的类转换为C的接口
转换原则

  • 所有的C++关键字及其特有的使用方式均不能出现在.h文件里,.h中仅有C函数的包装函数声明
  • 在class.cpp中实现对类的成员函数接口转换的函数,包括对类内成员的读写函数get() and set()
  • 如果要在包装函数中要实例化对象,尽量用new constructor()的将对象的内存实例化在堆中,否则对象会被析构
  • 记得在所有包含函数声明的文件中加入以下关键字,声明该函数为C函数,否则该函数的符号不会记录在二进制文件中

#ifdef __cplusplus
extern "C" {
#endif
xxxxxx function declaration xxxxx
#ifdef __cplusplus
}
#endif

最新文章

  1. Java三大框架之——Hibernate关联映射与级联操作
  2. Java Override/Overload
  3. [No000048]程序员的成长过程中,有哪些阶段?
  4. Boom.TV完成350万美元融资,目标直指VR电竞直播
  5. X86 架构和 ARM 架构
  6. java-----基本数据类型包装类
  7. oracle之spool详细使用总结
  8. 我这个IOS渣渣又来写随笔了
  9. DataTable填补了实体类返回泛型集合
  10. Cross platform GUI for creating SSL certs with OpenSSL
  11. LINQ学习系列-----1.3 扩展方法
  12. xml 制作 RSS 订阅源
  13. Windows下python2与python3兼容设置
  14. Windows系统中python3.7安装数据可视化模块Matplotlib、numpy的各种方法汇总
  15. 简单的jvm优化的尝试
  16. 数字图像处理的Matlab实现(1)—绪论
  17. Django电商项目---完成用户中心(订单中心+收货地址)day7
  18. ul+li水平居中的几种方法
  19. 如何修改隐藏Zblog/WordPress默认后台登录地址
  20. Python3:if __name__ == '__main__' 详解

热门文章

  1. Debian 防火墙 打开 关闭
  2. Dubbo 系列(05-1)服务发布
  3. Java接口自动化测试实战笔记
  4. 【转】Pandas速查手册中文版
  5. maven上传源码脚本
  6. C#程序的编译过程
  7. C#编程—第四天
  8. linux随笔-05
  9. Java高频经典面试题(第一季)五:递归与迭代
  10. easyui记录