Python调用C/C++的方法解析


Posted in Python onAugust 05, 2020

Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面就总结一下各种调用的方法, 给出例子, 所有例子都在ubuntu9.10, python2.6下试过.

1. Python 调用 C (base)

想在python中调用c函数, 如这儿的fact

#include <Python.h>

int fact(int n)
{
 if (n <= 1)
 return 1;
 else
 return n * fact(n - 1);
}

PyObject* wrap_fact(PyObject* self, PyObject* args)
{
 int n, result;

 if (! PyArg_ParseTuple(args, "i:fact", &n))
 return NULL;
 result = fact(n);
 return Py_BuildValue("i", result);
}

static PyMethodDef exampleMethods[] =
{
 {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
 {NULL, NULL}
};

void initexample()
{
 PyObject* m;
 m = Py_InitModule("example", exampleMethods);
}

把这段代码存为wrapper.c, 编成so库,

gcc -fPIC wrapper.c -o example.so -shared  -I/usr/include/python2.6 -I/usr/lib/python2.6/config

 然后在有此so库的目录, 进入python, 可以如下使用

import example

example.fact(4)

2. Python 调用 C++ (base)

在python中调用C++类成员函数, 如下调用TestFact类中的fact函数,

#include <Python.h>

class TestFact{
 public:
 TestFact(){};
 ~TestFact(){};
 int fact(int n);
};

int TestFact::fact(int n)
{
 if (n <= 1)
 return 1;
 else
 return n * (n - 1);
}

int fact(int n)
{
 TestFact t;
 return t.fact(n);
}

PyObject* wrap_fact(PyObject* self, PyObject* args)
{
 int n, result;

 if (! PyArg_ParseTuple(args, "i:fact", &n))
 return NULL;
 result = fact(n);
 return Py_BuildValue("i", result);
}

static PyMethodDef exampleMethods[] =
{
 {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
 {NULL, NULL}
};

extern "C"    //不加会导致找不到initexample
void initexample()
{
 PyObject* m;
 m = Py_InitModule("example", exampleMethods);
}

 把这段代码存为wrapper.cpp, 编成so库,

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

 然后在有此so库的目录, 进入python, 可以如下使用

import example

example.fact(4)

 3. Python 调用 C++ (Boost.Python)

Boost库是非常强大的库, 其中的python库可以用来封装c++被python调用, 功能比较强大, 不但可以封装函数还能封装类, 类成员.

http://dev.gameres.com/Program/Abstract/Building%20Hybrid%20Systems%20with%20Boost_Python.CHN.by.JERRY.htm

首先在ubuntu下安装boost.python, apt-get install libboost-python-dev

#include <boost/python.hpp>
char const* greet()
{
 return "hello, world";
}

BOOST_PYTHON_MODULE(hello)
{
 using namespace boost::python;
 def("greet", greet);
}

把代码存为hello.cpp, 编译成so库

g++ hello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1

 此处python路径设为你的python路径, 并且必须加-lboost_python-gcc42-mt-1_34_1, 这个库名不一定是这个, 去/user/lib查

 然后在有此so库的目录, 进入python, 可以如下使用

>>> import hello
>>> hello.greet()
'hello, world'

 4. python 调用 c++ (ctypes)

ctypes is an advanced ffi (Foreign Function Interface) packagefor Python 2.3 and higher. In Python 2.5 it is alreadyincluded.

ctypes allows to call functions in dlls/shared libraries and hasextensive facilities to create, access and manipulate simple andcomplicated C data types in Python - in other words: wraplibraries in pure Python. It is even possible to implement Ccallback functions in pure Python.

http://python.net/crew/theller/ctypes/

 
#include <Python.h>

class TestFact{
 public:
 TestFact(){};
 ~TestFact(){};
 int fact(int n);
};

int TestFact::fact(int n)
{
 if (n <= 1)
 return 1;
 else
 return n * (n - 1);
}

extern "C"
int fact(int n)
{
 TestFact t;
 return t.fact(n);
}

将代码存为wrapper.cpp不用写python接口封装, 直接编译成so库,

g++ -fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config

 进入python, 可以如下使用

>>> import ctypes
>>> pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')
>>> pdll.fact(4)
12

到此这篇关于Python调用C/C++的方法解析的文章就介绍到这了,更多相关Python调用C/C++的方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
Python查找函数f(x)=0根的解决方法
May 07 Python
itchat接口使用示例
Oct 23 Python
Python格式化日期时间操作示例
Jun 28 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
解决python replace函数替换无效问题
Jan 18 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
python 带时区的日期格式化操作
Oct 23 Python
浅谈Python3中print函数的换行
Aug 05 #Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 #Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
Aug 05 #Python
Node.js 和 Python之间该选择哪个?
Aug 05 #Python
基于python图书馆管理系统设计实例详解
Aug 05 #Python
基于Python的一个自动录入表格的小程序
Aug 05 #Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 #Python
You might like
PHP中for循环语句的几种变型
2006/11/26 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python 图片验证码代码分享
2012/07/04 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
numpy排序与集合运算用法示例
2017/12/15 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
毕业生在校学习的自我评价分享
2013/10/08 职场文书
便利店促销方案
2014/02/20 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
带病坚持工作事迹
2014/05/03 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
服务行业标语口号
2015/12/26 职场文书
python字典的元素访问实例详解
2021/07/21 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python