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中每次处理一个字符的5种方法
May 21 Python
在Django框架中伪造捕捉到的URLconf值的方法
Jul 18 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
python tkinter canvas使用实例
Nov 04 Python
解决django model修改添加字段报错的问题
Nov 18 Python
Tensorflow全局设置可见GPU编号操作
Jun 30 Python
Keras预训练的ImageNet模型实现分类操作
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获取访问者IP地址汇总
2015/04/24 PHP
php+ajax实现无刷新分页
2015/11/18 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
js 创建书签小工具之理论
2011/02/25 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
浅谈javascript的调试
2015/01/28 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
前端性能优化及技巧
2016/05/06 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
Python跳出循环语句continue与break的区别
2014/08/25 Python
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
python实现石头剪刀布程序
2021/01/20 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
如何使用PHP session
2015/04/21 面试题
laravel使用redis队列实例讲解
2021/03/23 PHP
加入学生会演讲稿
2014/04/24 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
新郎新娘答谢词
2015/01/04 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
运动会加油稿
2015/07/22 职场文书
责任书格式
2019/04/18 职场文书