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读写Redis数据库操作示例
Mar 18 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
简单了解python模块概念
Jan 11 Python
python读取word文档,插入mysql数据库的示例代码
Nov 07 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
详解用python生成随机数的几种方法
Aug 04 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
python异常处理和日志处理方式
Dec 24 Python
python中return不返回值的问题解析
Jul 22 Python
python实现简单聊天功能
Jul 07 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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
python的mysqldb安装步骤详解
2017/08/14 Python
python3处理含有中文的url方法
2018/05/10 Python
Gauss-Seidel迭代算法的Python实现详解
2019/06/29 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python regex库实例用法总结
2021/01/03 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
考试作弊检讨书
2014/10/21 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
结婚仪式主持词
2015/06/29 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
用Python selenium实现淘宝抢单机器人
2021/06/18 Python