Windows中Boost:python简单示例—— python调用c++函数

一、啰嗦的背景介绍
  • 最近在做的项目,小伙伴们主体功能想使用python。而通信模块,老师要求我使用成熟的C++框架,因为通信模块需要与对方的c++服务器进行连接。最开始有同学研究了一下python如何调用c++,也给自己发了链接:
    如何实现 C/C++ 与 Python 的通信?
    浅谈Python C扩展

  • 自己看了一会,就觉得过程太复杂。灵机一动,自己目前使用Boost.Asio进行网络通信。Boost作为一个强大的C++库,会不会封装了C++/Python的互相调用呢?

  • 结果一查,惊喜多多~有一个叫Boost.Python的东西!!!

  • Boost.Python简单概括:是Boost库的一部分;用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针。BoostPython库让C++和Python几乎无缝结合,是Boost库的一个功能。 用Boost.Python库,能快速、容易地将C++输出到Python。大多数情况下,你不需要修改C++类就能在Boost.Python中使用它。系统会简单地映射你的C++类和函数到Python。Boost.Python的这种绑定,是纯C++实现的,除了编辑器和编译器你什么别的都不需要。

  • boost.python 库提供了便捷的方法来将 C++ 中的函数、类等导入到 Python 中使用。我们只需要添加少量代码,就能 C++ 与 Python 的整合。将 C++ 代码借助 boost.python 编译成 Python 模块之后,我们可以像导入标准模块那样,将该模块导入,在 Python 中使用 C++ 中的类来创建变量,并调用其方法。总之,我们可以很方便地在 Python 中调用 C++ 实现的功能。两者的结合,既提高了程序的运行效率,也提高了编程的效率。
    在这里插入图片描述
    参考链接:
    Boost::Python 教程
    Boost.Python: 初步介绍
    利用 boost.python 库实现 C++ 与 Python 的整合
    boost.python——GettingStarted(官方文档)

二、下载并安装Boost.python库
  • 下载预编译版本:Home / boost-binaries / 1.69.0

  • 为了方便,本人32位和64位的版本都下载了:boost_1_69_0-msvc-12.0-64.exeboost_1_69_0-msvc-12.0-32.exe

  • boost_1_69_0-msvc-12.0-32.exe安装为例,点击boost_1_69_0-msvc-12.0-32.exe,出现如下界面。选择自己的安装目录,我选择的是D:\boost169_12。整个安装程序,类似一个提取压缩文件的过程,会将boost库提取到D:\boost169_12
    在这里插入图片描述

  • 点击“Next”,安装程序会不断的提取boost库到D:\boost169_12
    在这里插入图片描述

  • 提取完成后,boost库已经安装完成了,只需要在自己创建vs项目中进行配置即可。如何配置vs项目并检测boost库是否安装成功,可以参考本人以前的博客:VS2013配置Boost.Asio环境
    在这里插入图片描述

三、安装python2.7

参考博客:win10系统python2与python3自由切换之四部曲
这篇博客超级赞!!!让我都没有想重新写一篇记录一下python安装过程的欲望了。

四、创建VS项目,实现项目配置、 编译、生成
① 创建win32项目,并完成配置

创建C++的win32 空项目,命名为BoostPython1。配置如下:

  • 添加boost附加包含目录: 解决方案资源管理器 → 属性 → 配置属性 → C/C++ → 常规 → 附加包含目录 → 出现下拉菜单,点击编辑,弹出窗口 → 点击右右上角新建一条记录,内容为boost的安装路径:E:\boost169_12(这是我64位的boost安装目录)
  • 添加python附加包含目录: 解决方案资源管理器 → 属性 → 配置属性 → C/C++ → 常规 → 附加包含目录 → 出现下拉菜单,点击编辑,弹出窗口 → 点击右右上角新建一条记录,内容为python的安装路径:E:\Python27\include
  • 添加boost附加库目录: 解决方案资源管理器 → 属性 → 配置属性 → 链接器 → 常规 → 附加库目录 → 出现下拉菜单,点击编辑,弹出窗口 → 点击右右上角新建一条记录,内容为:E:\boost169_12\lib64-msvc-12.0
  • 添加python附加库目录: 解决方案资源管理器 → 属性 → 配置属性 → 链接器 → 常规 → 附加库目录 → 出现下拉菜单,点击编辑,弹出窗口 → 点击右右上角新建一条记录,内容为:E:\Python27\libs
② 创建cpp文件,存放要extending 为python的函数

创建Api.cpp,内容如下:

#include<string>
#include<iostream>

namespace{
	std::string greet1(std::string word){
		//return "hello, lucy! This is greet1 ...";
		return word;
	}
	
	char const* greet2(){
		return "hello, lucy! This is greet2 ...";
	}
}
③ 注册python模块,expose c++ 函数

创建ApiPy.cpp,内容如下:

#include<boost\python.hpp>
#include "Api.cpp"

using namespace boost::python;

BOOST_PYTHON_MODULE(helloLucy) //python模块名为helloLucy,调用模块时,直接使用import  helloLucy
{
    // Add regular functions to the module.
	def("greet1", greet1);  //为Api.cpp中的函数greet1,注册函数名为greet1
	def("greet2", greet2); //为Api.cpp中的函数greet2,注册函数名为greet2
}
④ 编译生成动态链接库dll
  • 解决方案资源管理器 → 属性 → 配置属性 → 常规 → 项目默认值 → 配置类型,选择dll
    在这里插入图片描述
  • 选择X64,按下ctrl+F5,实现动态链接库的生成。
  • 进入工程目录\BoostPython1\x64\Debug,将BoostPython1.dll拷贝到一个临时目录,改名为helloLucy.pyd,等待后面python项目的调用。
五、创建python项目,实现c++调用
  • 使用pycharm创建一个名为BoostPython1的项目,将helloLucy.pyd复制到BoostPython1目录下:

在这里插入图片描述

  • 创建callCpp.py文件,调用helloLucy模块,内容如下:
# -*- coding: UTF-8 -*-
import helloLucy

print helloLucy.greet1("hello, lucy! This is greet1 ...")
print helloLucy.greet2()
  • 终端输入命令运行callCpp.py,发现发错如下:
> python2 callCpp.py

在这里插入图片描述
原因:相应的boost.python动态库没有在python当前工作目录或搜索路径中
解决办法:E:\boost169_12\lib64-msvc-12.0\boost_python27-vc120-mt-gd-x64-1_69.dll也复制到BoostPython1目录下:
在这里插入图片描述

  • 重新运行,发现能在python中成功调用c++函数!

在这里插入图片描述
直接使用 pycharm run命令的结果:
在这里插入图片描述

至此,Windows中使用Boost:python实现 python调用c++函数,已经成功!!!

参考链接:
利用 boost.python 库实现 C++ 与 Python 的整合
boost.python——SimpleExample(官方文档)
boost.python笔记
请教boost.python库的问题 [问题点数:30分,结帖人caojie717](解决了ImportError: DLL load failed: 找不到指定的模块。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用Boost::Python可以非常方便地实现C++调用Python接口。以下是简单的步骤: 1. 安装Boost库和Python解释器。 2. 编写一个Python模块,在其定义一些函数或类,这些函数或类是你希望C++调用的接口。 3. 用Boost::Python库将Python模块导出到C++,使得C++可以调用Python模块函数和类。 4. 在C++代码调用Python模块函数或类。 下面是一个简单示例代码,演示了如何使用Boost::Python实现C++调用Python接口: ```cpp #include <boost/python.hpp> #include <iostream> // 定义一个Python函数 int add(int x, int y) { return x + y; } // 导出Python函数C++ BOOST_PYTHON_MODULE(example) { using namespace boost::python; def("add", add); } int main() { // 初始化Python解释器 Py_Initialize(); // 导入Python模块 boost::python::object example_module = boost::python::import("example"); // 调用Python函数 boost::python::object result = example_module.attr("add")(1, 2); // 将Python返回值转换为C++类型 int sum = boost::python::extract<int>(result); // 输出结果 std::cout << "1 + 2 = " << sum << std::endl; // 释放Python解释器 Py_Finalize(); } ``` 在这个例子,我们定义了一个名为`add`的Python函数,在C++通过`def`函数将其导出。然后,在C++代码导入了Python模块,调用Python函数,并将其返回值转换为C++类型。最后输出了结果。 这只是一个简单的例子,Boost::Python还支持更复杂的数据类型和类的导出。如果你想深入了解Boost::Python的使用,可以参考官方文档和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值