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中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
Python SQLite3简介
Feb 22 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
Python list与NumPy array 区分详解
Nov 06 Python
Python接口自动化判断元素原理解析
Feb 24 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
Python计算矩阵的和积的实例详解
Sep 10 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 Python
Python实战之OpenCV实现猫脸检测
Jun 26 Python
Python标准库pathlib操作目录和文件
Nov 20 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开发框架总结收藏
2008/04/24 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
常用的javascript function代码
2008/05/23 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
jQuery操作css样式
2017/05/15 jQuery
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
python使用urlparse分析网址中域名的方法
2015/04/15 Python
对pandas里的loc并列条件索引的实例讲解
2018/11/15 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Django REST framwork的权限验证实例
2020/04/02 Python
镇班子对照检查材料思想汇报
2014/09/24 职场文书
销售工作决心书
2015/02/04 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python
python调试工具Birdseye的使用教程
2021/05/25 Python
5道关于python基础 while循环练习题
2021/11/27 Python