【2013】实习收获4:关于python中利用ctypes调用c++代码的学习总结
来源:互联网 发布:淘宝好的盗版手办店 编辑:程序博客网 时间:2024/06/05 16:07
在春总指导下研究了python下如何调用c/c++代码,并做次总结。
因为python的内核就是c语言写的,所以python和c、c++的相互调用便是理所当然了。
1. #include<Python.h>
这需要在系统中安装python-dev这个额外的包才能有Python.h。
安装命令如下(我们服务器上python版本是2.7.5,所以plugin包选择了python2.7-dev,根据自己情况调整:
2. extern "C"
加入 #include<Python.h> 后还需要将c++代码中允许python调用的函数/类的成员函数打包成python的module,写了一个小例子TestFact.cpp如下:
在这个例子中创建了一个类TestFact, 并且定义了两个成员函数。 之后将两个成员函数分别包装。
注意:一定要加上 extern "C", 否则会报错。
3.生成so文件
下一步是将c++代码生成*.so文件。
(1).若用g++生成,用如下命令
(2).若用cmake生成,代码如下
此外,还需要设置python库的共享链接库地址,即/usr/lib//python2.7/config。
运用ctypes库的功能,d是一个ctypes.CDLL的对象,指向cpl2.so这个共享库。
若要调用cpl2.so中已包装好的module,直接调用 d.module名 即可。
5.多个文件的调用
若要一次性调用多个文件,有两种方法
(1).生成 .so 文件的时候将多个c++文件分别生成各自的 .so文件。
(2).将多个c++文件生成同一个.so文件,这用g++或cmake都很容易实现. 需要注意的是,同一个.so文件中包装的module名不能重复。
后记: 除了ctypes以外, 在python中调用c++还可以运用boost库或利用swig来实现,这两种方法还有待学习。
因为python的内核就是c语言写的,所以python和c、c++的相互调用便是理所当然了。
1. #include<Python.h>
首先,需要在被调用的c++代码中加入
#include<Python.h>
这需要在系统中安装python-dev这个额外的包才能有Python.h。
安装命令如下(我们服务器上python版本是2.7.5,所以plugin包选择了python2.7-dev,根据自己情况调整:
sudo apt-get install python2.7-dev
2. extern "C"
加入 #include<Python.h> 后还需要将c++代码中允许python调用的函数/类的成员函数打包成python的module,写了一个小例子TestFact.cpp如下:
#include <Python.h>#include <string>using namespace std;class TestFact{ public: TestFact(){} ~TestFact(){} int fact(int n); string prints(void);};int TestFact::fact(int n){ return n+10;}string TestFact::prints(){ string str="Today is not a sunny day!"; return str;}extern "C"int fact(int n){ TestFact t; return t.fact(n);}extern "C"string prints(){ TestFact t; string str=t.prints(); return str;}
在这个例子中创建了一个类TestFact, 并且定义了两个成员函数。 之后将两个成员函数分别包装。
注意:一定要加上 extern "C", 否则会报错。
3.生成so文件
下一步是将c++代码生成*.so文件。
(1).若用g++生成,用如下命令
g++ -fPIC -shared -o TestFact.so TestFact.cpp -I/usr/include/python2.7 -I/usr/lib/python2.7/config
(2).若用cmake生成,代码如下
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(TESTFACT) SET(CMAKE_BUILD_TYPE Debug) SET(COMPILER "gpp") SET(LIB_TESTFACT TESTFACT) INCLUDE_DIRECTORIES("/usr/include/python2.7") INCLUDE_DIRECTORIES("/usr/lib//python2.7/config") SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(SRC_LIST TestFact.cpp) ADD_LIBRARY(${LIB_TESTFACT} SHARED ${SRC_LIST})注意:Python.h 的文件路径需要手动设置,不在系统默认文件夹内,其地址为/usr/include/python2.7
此外,还需要设置python库的共享链接库地址,即/usr/lib//python2.7/config。
这些路径也应根据具体情况有所改变
成功生成后会得到 libTESTFACT.so 位于 项目路径/build/bin下
4. python调用
最后一步是使用python调用 .so文件。 写了一个小例子如下:
#!/usr/bin/env pythonimport ctypesd=ctypes.CDLL("./cpl2.so")c=d.prints()print cprint d.fact(10)
运用ctypes库的功能,d是一个ctypes.CDLL的对象,指向cpl2.so这个共享库。
若要调用cpl2.so中已包装好的module,直接调用 d.module名 即可。
5.多个文件的调用
若要一次性调用多个文件,有两种方法
(1).生成 .so 文件的时候将多个c++文件分别生成各自的 .so文件。
(2).将多个c++文件生成同一个.so文件,这用g++或cmake都很容易实现. 需要注意的是,同一个.so文件中包装的module名不能重复。
后记: 除了ctypes以外, 在python中调用c++还可以运用boost库或利用swig来实现,这两种方法还有待学习。
- 【2013】实习收获4:关于python中利用ctypes调用c++代码的学习总结
- python脚本利用ctypes调用c模块返回字符串
- Python 使用库ctypes调用C代码接口
- Python中ctypes库的学习
- python学习笔记--使用ctypes调用C函数
- Python编程.利用ctypes调用Windows API
- ctypes: 使用python调用C编写的动态链接库
- C/C++ 生成的.so文件,python 用ctypes调用
- 关于python3调用C/C++的方法(ctypes)
- python ctypes - python调用C语言库
- Python 使用ctypes调用 C 函数
- Python调用ctypes使用C函数printf
- Python 使用ctypes调用 C 函数
- Python 使用ctypes调用C/C++
- python使用ctypes调用C/C++
- python利用ctypes的指针传入int型列表和string类型列表到c语言中
- Python与C之间的相互调用(Python C API及Python ctypes库)
- Python与C之间的相互调用(Python C API及Python ctypes库)【转】
- 从程序员到项目经理(8):程序员加油站 -- 不要死于直率
- Oracle 定时备份
- 浅谈动作游戏打击感:强弱源于判定帧率
- eclipse junit入门篇
- 从程序员到项目经理(9):程序员加油站 -- 再牛也要合群
- 【2013】实习收获4:关于python中利用ctypes调用c++代码的学习总结
- 测试必须掌握的SQL语句带习题
- S5PV210调试WM8960 总结
- hdu1695 (容斥原理)
- kinect控制ogre 斯巴达
- 从程序员到项目经理(10):程序员加油站 --要执着但不要固执
- js 去空格
- C# /vb 多文件上传
- 关于游戏打击感