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读写文件方法总结
Jun 09 Python
Python 基础之字符串string详解及实例
Apr 01 Python
python利用dir函数查看类中所有成员函数示例代码
Sep 08 Python
Python 多进程和数据传递的理解
Oct 09 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
matplotlib作图添加表格实例代码
Jan 23 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
基于Python函数和变量名解析
Jul 19 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 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
Terran历史背景
2020/03/14 星际争霸
php延迟静态绑定实例分析
2015/02/08 PHP
js prototype截取字符串函数
2010/04/01 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
关于react中组件通信的几种方式详解
2017/12/10 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
解决Vue项目中tff报错的问题
2020/10/21 Javascript
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
Python AES加密模块用法分析
2017/05/22 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
Python实现AI换脸功能
2020/04/10 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
学生个人自我鉴定
2014/03/26 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
教师业务学习材料
2014/12/16 职场文书
小学生思想品德评语
2014/12/31 职场文书
蜗居观后感
2015/06/11 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python