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写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
Python之os操作方法(详解)
Jun 15 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
Nov 15 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
Feb 07 Python
利用python中集合的唯一性实现去重
Feb 11 Python
python3 kubernetes api的使用示例
Jan 12 Python
Pandas的数据过滤实现
Jan 15 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
javascript函数库-集合框架
2007/04/27 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
Python获取Linux系统下的本机IP地址代码分享
2014/11/07 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
公务员总结性个人自我评价
2013/12/05 职场文书
婚前财产公证书
2014/04/10 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书