我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python和C++的混合编程(使用Bo

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python和C++的混合编程(使用Bo


  想要享受更轻松愉悦的编程,脚本语言是首选。想要更敏捷高效,c++则高山仰止。所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中。原来贡献过一篇《c++和js的混合编程》也是同样的目的。
  得益于机器学习领域的发展,Python最近一直维持热度,但Python的速度,比node.js都差距不小,所以使用c++来提高一些速度更有必要。
  编写Python的扩展模块已经有不少的不错的框架,但感觉上boost是最好用的一个。

环境准备

  本文的实验环境为mac电脑。使用Linux环境通常也可以使用apt或者yum来安装配置对应的开发环境,请查看其它介绍文档。
  在mac上准备环境很容易,首先要已经安装Xcode,并且安装了Xcode的命令行工具。其次要安装Homebrew扩展包管理工具。这部分是基础的开发环境,这里不做额外说明。
  在命令行执行brew install boost-python3,一行命令就可以安装完成Python模块的开发环境。(本例中完全使用Python3为例来说明,如果想制作Python2的扩展包,请根据需要修改相应的名称和版本号)。

简单示例

  从boost官网抄了一个简单的示例,包括了初始化、从Python传递参数给c++和从c++返回结果给Python的一个基本流程。源代码非常短,请看下面:

#include <string>
#include <boost/python.hpp>

using namespace std;
using namespace boost::python;
    
struct World{
    void set(string msg) { this->msg = msg; }
    string greet() { return msg; }
    string msg;
};

//特别注意下面的模块名hello同将来引入Python的模块名、编译完成的文件名,三者必须相同 
BOOST_PYTHON_MODULE(hello){
   class_<World>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
   ;
}

编译

  假设上面的c++代码保存为hello.cpp文件。使用如下两行命令可以完成编译:

#生成.o临时编译文件
g++ -fpic -c hello.cpp $(pkg-config --cflags python3)
#生成.so工作文件
g++ -shared -o hello.so hello.o -lboost_python37 $(pkg-config --cflags --libs python3)

  上面的两行编译命令中,有两个编译参数可能是需要根据具体版本做调整的,一个是pkg-config库管理工具中的python3,这个名称和版本号可以检查如下路径的配置文件,根据自己需要选择对应的库版本,比如python3对应需要有python3.pc文件:

ls /usr/local/lib/pkgconfig/python*pc

  另外一个是第二行命令中的-lboost_python37,这个检查已经安装的库版本来决定,比如-lboost_python37对应需要有libboost_python37.dylib文件,特别注意这个版本同将来运行的python环境版本必须精确一致,小版本也必须相同:

ls /usr/local/lib/libboost_python*

验证

  编译完成会在当前目录生成hello.so文件,这时候可以直接使用Python的交互模式来验证扩展模块的使用:

$ python3
Python 3.7.0 (default, Sep 18 2018, 18:47:22) 
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
>>> test=hello.World()
>>> test.set("hello 世界");
>>> test.greet()
'hello 世界'

bjam编译

  boost官方推荐使用Boost.Build系统bjam来编译,比Makefile之类的确会略微的方便一点,这里介绍出来供参考。
  安装bjam:brew install bjam
  在当前目录建立一个文本文件Jamroot,内容为:

import python ;

using python : 3 ;

lib boost_python37 ;

project demo
  : requirements
    <location>.
    <library>boost_python37
  ; 
#注意下面的hello,同cpp文件中最后导出的模块名必须相同
python-extension hello
    : hello.cpp
    : <cxxflags>"`pkg-config --cflags python3`"
    : <linkflags>"`pkg-config --libs python3`"
    ;

  在命令行执行bjam命令,会自动编译生成hello.o及hello.dylib文件,.o文件为临时文件可以删除,.dylib文件改名为.so文件就是我们需要的Python扩展库,使用起来是完全相同的。

参考资料

  https://www.boost.org/doc/libs/1_60_0/libs/python/doc/html/tutorial/index.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python和C++的混合编程(使用Bo

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python和C++的混合编程(使用Bo

想要享受更轻松愉悦的编程,脚本语言是首选。想要更敏捷高效,c++则高山仰止。所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中。原来贡献过一篇《c++和js的混合编程》也是同样的目的。  得益于机器学习领域的发展,Pytho
2023-01-30

python+C、C++混合编程的应用

TIOBE每个月都会新鲜出炉一份流行编程语言排行榜,这里会列出最流行的20种语言。排序说明不了语言的好坏,反应的不过是某个软件开发领域的热门程度。语言的发展不是越来越common,而是越来越专注领域。有的语言专注于简单高效,比如python
2023-01-31

Python调用Matlab的混合编程

一. 配置方法:找到Matlab安装根目录,比如D:\matlab,然后进入D:\matlab\extern\engines\python目录中,Shift+右键-->“在此处打开命令窗口”,1.有管理员权限的,用 管理员权限执行:pyth
2023-01-31

混合语言编程—C#使用原生的Directx和OpenGL绘图的方法

本文要说的是混合C#和C/C++语言编程,在C#的Winform和WPF下使用原生的Direct和OpenGL进行绘图
2022-11-15

Python与Matlab混合编程的实现案例

本文主要介绍了Python与Matlab混合编程的实现案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-28

C/C++在Java、Android和Objective-C三大平台下实现混合编程

Android和iOS开发都支持C++开发,可以一套代码多平台使用。同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率。 一、为什么使用C/C++便于移植,用C/C++写得库可以
2022-06-06

批处理与python代码混合编程的方法

批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值,比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写,bathome出品的命令工具包管理器bcn 使用了bat+jscript的混编实现的
2022-06-04

Python混合如何使用同步和异步函数

这篇文章主要介绍“Python混合如何使用同步和异步函数”,在日常操作中,相信很多人在Python混合如何使用同步和异步函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python混合如何使用同步和异步函数
2023-07-06

CSS中float和margin混合使用的案例

小编给大家分享一下CSS中float和margin混合使用的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!float属性float: left | right
2023-06-08

python 多进程和协程配合使用

有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录。现在需要读取这些txt文件,判断key是否在数据仓库中。(redis或者mysql)为空的记录,需要写入到日志文件中!任务分工1. 使用多进程技术,每一个进程读取一个t
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录