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中异常捕获方法详解
Mar 03 Python
浅谈Python中的作用域规则和闭包
Mar 20 Python
pandas DataFrame实现几列数据合并成为新的一列方法
Jun 08 Python
Python使用combinations实现排列组合的方法
Nov 13 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
使用TensorFlow-Slim进行图像分类的实现
Dec 31 Python
python画环形图的方法
Mar 25 Python
pytorch读取图像数据转成opencv格式实例
Jun 02 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
教你如何用python操作摄像头以及对视频流的处理
Oct 12 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性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
JQuery实现自定义对话框的代码
2008/06/15 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
Python实现的排列组合计算操作示例
2017/10/13 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
浅谈python常用程序算法
2019/03/22 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
python已协程方式处理任务实现过程
2019/12/27 Python
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
单位办理社保介绍信
2014/01/10 职场文书
吨的认识教学反思
2014/04/27 职场文书
普通党员对照检查材料
2014/09/24 职场文书
小学运动会报道稿
2014/10/04 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
母亲节主题班会
2015/08/14 职场文书
大学学生会竞选稿
2015/11/19 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
创业计划书之服装
2019/10/07 职场文书
导游词之井冈山
2019/11/20 职场文书