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 相关文章推荐
Python列表list数组array用法实例解析
Oct 28 Python
python刷投票的脚本实现代码
Nov 08 Python
python中的闭包用法实例详解
May 05 Python
python黑魔法之编码转换
Jan 25 Python
Python爬取三国演义的实现方法
Sep 12 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
Jan 23 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
python 连续不等式语法糖实例
Apr 15 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
python批量修改交换机密码的示例
Sep 22 Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 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设计模式之观察者模式的应用详解
2013/05/21 PHP
javascript下string.format函数补充
2010/08/24 Javascript
关于jQuery中的end()使用方法
2011/07/10 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
html+css+js实现xp window界面及有关功能
2013/03/26 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
神经网络(BP)算法Python实现及应用
2018/04/16 Python
python 不以科学计数法输出的方法
2018/07/16 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
python实现文件的分割与合并
2019/08/29 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
安全保证书范文
2014/04/29 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
接待员岗位职责范本
2015/04/15 职场文书
交通安全月活动总结
2015/05/08 职场文书
亮剑观后感
2015/06/05 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js