广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Python和C++的混合编程(使用Bo
  • 117
分享到

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

PythonBo 2023-01-30 22:01:12 117人浏览 安东尼
摘要

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


  想要享受更轻松愉悦的编程,脚本语言是首选。想要更敏捷高效,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

--结束END--

本文标题: Python和C++的混合编程(使用Bo

本文链接: https://www.lsjlt.com/news/179943.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python和C++的混合编程(使用Bo
      想要享受更轻松愉悦的编程,脚本语言是首选。想要更敏捷高效,c++则高山仰止。所以我一直试图在各种通用或者专用的脚本语言中将c++的优势融入其中。原来贡献过一篇《c++和js的混合编程》也是同样的目的。   得益于机器学习领域的发展,...
    99+
    2023-01-30
    Python Bo
  • Python 和 C++ 混合编程:pybind11 使用
    Python 和 C++ 混合编程:pybind11 使用 1. 目的需求2. pybind 11 简介3. 使用实践:一个简单的实例3.1 开发环境3.2 准备工作3.3 建立工程 test...
    99+
    2023-09-09
    python c++ 开发语言
  • python+C、C++混合编程的应用
    TIOBE每个月都会新鲜出炉一份流行编程语言排行榜,这里会列出最流行的20种语言。排序说明不了语言的好坏,反应的不过是某个软件开发领域的热门程度。语言的发展不是越来越common,而是越来越专注领域。有的语言专注于简单高效,比如python...
    99+
    2023-01-31
    python
  • Python调用Matlab的混合编程
    一. 配置方法: 找到Matlab安装根目录,比如D:\matlab,然后进入D:\matlab\extern\engines\python目录中,Shift+右键-->“在此处打开命令窗口”, 1.有管理员权限的,用 管理员权限执...
    99+
    2023-01-31
    Python Matlab
  • C++调用Python(混合编程)函数整理总结
    文章目录 C++调用python概述相关官方文档相关函数1.初始化python解释器环境2.调用python脚本的静态简单方式3.动态加载python模块并执行函数3.1不带参数和返回值的举例...
    99+
    2023-09-03
    python c++ 开发语言
  • C++和C的混合编译的项目实践
    目录简介某企业曾经给出如下的一道面试题问题分析关于 extern “C”extern关键字用法举例静态库是什么创建C静态库尝试使用C++程序调用C静态库创建C...
    99+
    2022-11-13
  • C与汇编混合编程的实现示例
    目录1. C语言内联汇编2. C语言调用汇编函数3. 汇编代码调用C语言函数上一期中,使用链表的方式进行对不同任务的调用,实现的效果还是不错的,但是,任务在进行过程中不能进行来回的切...
    99+
    2022-11-12
  • 混合语言编程—C#使用原生的Directx和OpenGL绘图的方法
    由于项目需要做一些图形展示,所以就想到了使用Directx和OpenGL来绘图,但项目准备使用C#来开发(大家比较熟悉C#),在网上看了相关的资料,有一些第三方的控件可用,试用了下,...
    99+
    2022-11-15
    C# Directx OpenGL
  • Python与Matlab混合编程的实现案例
    目录前言一、环境准备二、简单示例三、更复杂的示例1.调用.m文件2.调用自定义函数3.绘图测试四、项目相关前言 因为项目需要,需要批处理很多Matlab的.m文件,从每个文件中提取结...
    99+
    2023-01-28
    Python与Matlab混合编程 Python Matlab混合编程
  • C/C++在Java、Android和Objective-C三大平台下实现混合编程
    Android和iOS开发都支持C++开发,可以一套代码多平台使用。同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行...
    99+
    2022-06-06
    c+ JAVA objective-c C++ Android
  • 批处理与python代码混合编程的方法
    批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值,比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写,bathome出品的命令工具包管理器bcn 使用了...
    99+
    2022-06-04
    批处理 代码 方法
  • Python混合怎么使用同步和异步函数
    在协程函数中调用同步函数在协程函数中直接调用同步函数会阻塞事件循环,从而影响整个程序的性能。我们先来看一个例子:以下是使用异步 Web 框架 FastAPI 写的一个例子,FastAPI 是比较快,但不正确的操作将会变得很慢。import ...
    99+
    2023-05-14
    Python
  • Python混合如何使用同步和异步函数
    这篇文章主要介绍“Python混合如何使用同步和异步函数”,在日常操作中,相信很多人在Python混合如何使用同步和异步函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python混合如何使用同步和异步函数...
    99+
    2023-07-06
  • AJAX和JSP混合使用的示例分析
    这篇文章将为大家详细讲解有关AJAX和JSP混合使用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先要知道AJAX 是一种在无需重新加载整个网页的情况下,能够...
    99+
    2022-10-19
  • CSS中float和margin混合使用的案例
    小编给大家分享一下CSS中float和margin混合使用的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!float属性float: left | right...
    99+
    2023-06-08
  • Python、文件响应和自然语言处理:如何混合使用?
    Python是一个强大的编程语言,可以应用于各种领域,包括文件处理和自然语言处理。在本文中,我们将探讨如何结合使用Python、文件响应和自然语言处理,以便更好地处理文本数据。 文件响应是指以一种格式将文件发送给客户端浏览器。在Pytho...
    99+
    2023-07-02
    文件 自然语言处理 响应
  • SQL语句中OR和AND的混合使用的小技巧
    今天有这样得一个需求,如果登陆人是客服的话,会查询订单是'该客服'以及还没有匹配客服的,刚开始想的是直接在sql语句上拼写  or  assigned_id is null  ...
    99+
    2022-10-18
  • Python小实例混合使用turtle和tkinter让小海龟互动起来
    Turtle 窗口 请看下图,turtle窗口图标是一片小叶子,估计它就是继承自 tkinter 库。 tkinter 窗口 参阅了一些资料,发现 turtle 方法可直接在 tk...
    99+
    2022-11-12
  • python 多进程和协程配合使用
    有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录。现在需要读取这些txt文件,判断key是否在数据仓库中。(redis或者mysql)为空的记录,需要写入到日志文件中! 任务分工1. 使用多进程技术,每一个进...
    99+
    2023-01-31
    进程 和协 python
  • C/C++编程中const的使用详解
    目录1 概述:const和define的区别2. 修饰局部变量3. 常量指针与指针常量4. 修饰函数的参数5. 修饰函数的返回值6. 修饰全局变量总结1 概述:const和defin...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作