学习是一个累积的过程。在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结。

前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C++写python扩展模块有很多种方式,我选择的是boost.python来编写的,感觉这个要比其他的方式要简单很多,本文概述方便封装C++类给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

学习笔记整理于猿人学教程

python学习笔记:安装boost python库以及使用boost.python库封装的更多相关文章

  1. Python学习笔记——安装

    最近打算使用下GAE,便准备学习一下python.我对python是一窍不通,因此这里将我的学习历程记录下来,方便后续复习. 安装python: 可以从如下地址:http://www.python.o ...

  2. Python学习笔记-CGI编程(如何在IIS上挂Python开发的Webservice)

    一.如何用Python开发一个简单的Webservice 利用python的cgi编程,可以传入参数将结果输出. 定义需要编码以及需要引用的模块 #conding=utf-8 #修正中文乱码 impo ...

  3. Python学习笔记【第十五篇】:Python网络编程三ftp案例练习--断点续传

    开发一个支持多用户在线的FTP程序-------------------主要是学习思路 实现功能点 1:用户登陆验证(用户名.密码) 2:实现多用户登陆 3:实现简单的cmd命令操作 4:文件的上传( ...

  4. python学习笔记(二)---编辑工具sublimeText3运行python

    转载地址:https://blog.csdn.net/Maek_Tyx/article/details/76933897 1. 打开Sublime text 3 安装package controlSu ...

  5. Python学习笔记【第十四篇】:Python网络编程二黏包问题、socketserver、验证合法性

    TCP/IP网络通讯粘包问题 案例:模拟执行shell命令,服务器返回相应的类容.发送指令的客户端容错率暂无考虑,按照正确的指令发送即可. 服务端代码 # -*- coding: utf- -*- # ...

  6. Python学习笔记【第十二篇】:Python异常处理

    什么是异常 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下 错误类型分为两种:语法错误和业务逻辑错. 异常的类型 AttributeError 试图访问一个对象没有的树形,比如 ...

  7. 【Python学习笔记】Coursera课程《Using Databases with Python》 密歇根大学 Charles Severance——Week4 Many-to-Many Relationships in SQL课堂笔记

    Coursera课程<Using Databases with Python> 密歇根大学 Week4 Many-to-Many Relationships in SQL 15.8 Man ...

  8. 【目录】Python学习笔记

    目录:Python学习笔记 目标:坚持每天学习,每周一篇博文 1. Python学习笔记 - day1 - 概述及安装 2.Python学习笔记 - day2 - PyCharm的基本使用 3.Pyt ...

  9. Python学习笔记(15)- os\os.path 操作文件

    程序1 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: import os def countfile(path): dict1 = {} # 定义一个字典 all_files = ...

  10. Python学习笔记之基础篇(-)python介绍与安装

    Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...

随机推荐

  1. jeesite框架前端 tabPage页签刷新功能。

    js主动刷新当前页签的js代码 原本想找一下jeesite有没有主动刷新当前页面的内置方法. 官方文档找了一大堆,找都找不到,也可能我这个需求比较少人需要. tab标签页有一个右键刷新页签功能 查看编 ...

  2. IIS中应用Application Request Route 配置负载均衡

    转自:https://blog.csdn.net/wucong60/article/details/84930234 简介ApplicationRequest Route(后面简称为ARR)是一个寄宿 ...

  3. 微信小程序的target和currentTarget的区别

    https://www.jb51.net/article/160886.htm 在小程序的事件回调触发时,会接收一个事件对象,事件对象的参数中包含一个target和currentTarget属性,接下 ...

  4. 物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区

    物联网安全himqtt防火墙数据结构之ringbuffer环形缓冲区 随着5G的普及,物联网安全显得特别重要,himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Applicatio ...

  5. 如何创建spring web 工程(maven工程)

    1.在项目资源管理器右键,New-Spring Starter Project 2.设置一些参数 3.点击Next,然后勾选两个选项 4.点击finish

  6. Charles系列一:Charles功能介绍、下载安装和界面简介

    一:Charles主要功能介绍 Charles是一个HTTP代理/HTTP监视器/反向代理,使开发和测试人员能够查看机器和Internet之间所有的HTTP和SSL/HTTPS流量,这包括请求,响应. ...

  7. Linux Centos下软件的安装与卸载方法

    转载于: http://blog.csdn.net/zolalad/article/details/11368879 Linux下软件的安装与卸载   第一章   linux下安装软件,如何知道软件安 ...

  8. Comet OJ Contest #15 D. 双十一特惠(困难版)

    以 $d(x)$ 表示正整数 $x$ 的十进制表示的数位之和.熟知下列关于 $d(x)$ 的结论: $d(x) \equiv x \pmod{9}$.从而对于任意正整数列 $a_1, a_2, \do ...

  9. A司入职面试宝典

    =公司介绍============================= 世界500强,每股股票2000刀. 面试难度:**** 加班程度:* =面试-流程介绍====================== ...

  10. EffectiveC++

    宁可以编译器替换预处理器 define 不被视为语言的一部分,因此也就有可能在预处理阶段被优化掉,导致相关变量出现错误. #define ASPECT_RATIO 1.63 //可以尝试将其替换为 c ...