一、啰嗦的背景介绍
-
最近在做的项目,小伙伴们主体功能想使用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.exe 、boost_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: 找不到指定的模块。
)