Python的C/C++扩展——boost_python编写Python模块
前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数,本文概述方便封装C++类给Python使用的boost_python库。
安装boost python库:
sudo aptitude install libboost-python-dev
示例
下面代码简单实现了一个普通函数maxab()和一个Student类:
#include <iostream> #include <string> int maxab(int a, int b) { return a>b?a:b; } class Student { private: int age; std::string name; public: Student() {} Student(std::string const& _name, int _age) { name=_name; age=_age; } static void myrole() { std::cout << "I'm a student!" << std::endl; } void whoami() { std::cout << "I am " << name << std::endl; } bool operator==(Student const& s) const { return age == s.age; } bool operator!=(Student const& s) const { return age != s.age; } };
使用boost.python库封装也很简单,如下代码所示:
#include <Python.h> #include <boost/python.hpp> #include <boost/python/suite/indexing/vector_indexing_suite.hpp> #include <vector> #include "student.h" using namespace boost::python; BOOST_PYTHON_MODULE(student) { // This will enable user-defined docstrings and python signatures, // while disabling the C++ signatures scope().attr("__version__") = "1.0.0"; scope().attr("__doc__") = "a demo module to use boost_python."; docstring_options local_docstring_options(true, false, false); def( "maxab", &maxab, "return max of two numbers.\n" ); class_<Student>("Student", "a class of student") .def(init<>()) .def(init<std::string, int>()) // methods for Chinese word segmentation .def( "whoami", &Student::whoami, "method's doc string..." ) .def( "myrole", &Student::myrole, "method's doc string..." ) .staticmethod("myrole"); // 封装STL class_<std::vector<Student> >("StudentVec") .def(vector_indexing_suite<std::vector<Student> >()) ; }
上述代码还是include了Python.h文件,如果不include的话,会报错误:
wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory
编译
编译以上代码有两种方式,一种是在命令行下面直接使用g++编译:
g++ -I/usr/include/python2.7 -fPIC wrap_student.cpp -lboost_python -shared -o student.so
首先指定Python.h的路径,如果是Python 3的话就要修改为相应的路径,编译wrap_student.cpp要指定-fPIC参数,链接(-lboost_python)生成动态库(-shared)。 生成的student.so动态库就可以被python直接import使用了
In [1]: import student
In [2]: student.maxab(2, 5)
Out[2]: 5
In [3]: s = student.Student('Tom', 12)
In [4]: s.whoami()
I am Tom
In [5]: s.myrole()
I'm a student!
另外一直方法是用python的setuptools编写setup.py脚本:
#!/usr/bin/env python from setuptools import setup, Extension setup(name="student", ext_modules=[ Extension("student", ["wrap_student.cpp"], libraries = ["boost_python"]) ])
然后执行命令编译:
python setup.py build or sudo python setup.py install
文章版权归属于 猿人学
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何快速构建数据库智能化运维平台(一)
简介 本人出身DBA,主业Oracle,副业PostgreSQL,由于生性懒惰,遂沉迷于自动化运维与智能化运维不能自拔,实现过数据库自动化运维平台、容灾一键切换平台,目前正在坚定地向智能化迈进。从后台管理来说,数据库运维管理是极其重要的组成部分,对业务系统、生产稳定的影响不言而喻。随着业务规模的不断扩大,原有的人肉运维方式已经越来越难以满足运维需求,因此,自动化运维平台、智能化运维平台应运而生。本系列为作者原创,将多年对自动化运维的思考沉淀下来,以平台构建的形式展示给大家,希望对大家有所帮助,欢迎大家批评指正! 写在动手之前 1.目标范围 顾名思义,自动化是将手工操作变革为机器自动操作。但是,许多人在平台建设初期往往会进入一个误区:要穷举可能用到的所有场景,把所有的运维工作都做成自动化,彻底解放人工。想法固然是好,但是由于数据库运维的复杂性,在实际建设过程中会举步维艰,难以为继。我所理解的自动化,是要解决DBA的痛点,而且是最痛的点,把DBA从繁琐的、周期性的、价值低的重复工作中解放出来,注意,我强调的是痛点,而不是全部。这一点非常重要! 2.构建基础 数据库自动化的实现,离不开数据库...
- 下一篇
4月1日云栖精选夜读 | 代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市
【点击订阅云栖夜读周刊】 2019年,淘鲜达要在100个城市完成1000个门店的新零售改造。 热点热议 代号“凤凰”,阿里新零售秘密武器,今年要打入100个城市 作者:技术小能手发表在:天下网商 阿里小二的日常工作要被TA们“接管”了! 作者:隐林发表在:阿里巴巴大数据 —玩家社区 说说我为什么看好Spring Cloud Alibaba 作者:程序猿dd 知识整理 SQL Server删除数据库 作者:金澎 ECS和RDS连接条件 作者:金澎 好程序员web前端培训分享Javascript中原型属性 作者:好程序员 基于ECS使用FileZilla Server建立安全的SSL/TLS FTP 作者:bbskkb发表在:阿里云MVP 如何通过报表单元格右键控制报表跳转到不同链接地址 作者:飘然轻落 美文回顾 最快1秒鉴定真假,AI谣言粉碎机来了! 作者:技术小能手 藏经阁计划发布一年,阿里知识引擎有哪些技术突破? 作者:技术小能手发表在:阿里技术 数据报表多种序号生成方式 作者:飘然轻落 好程序员分享做HTML5页面你要懂得这些 作者:好程序员 Android环境下hanlp汉字转拼...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案