python联调c++和QT
python做代理层,连接c++和QT
python调用c代码,方式很多,本章借助于pybind11
准备工作
- 将c++代码编译成动态库.so库或.pyd
- python使用pip工具,直接下载动态库到解释器环境
- python代码中直接import C 封装的库
编译动态库
编译和下载库到解释器环境
1.下载动态库
本项目使用的DEBUG模式,下载动态库之前要设置DEBUG模式,在封装库的文件路径下下载
1.set DEBUG=1
2.pip install ./文件名(库名)
pip install ./pysocket
2.编译更新库
当项目C++代码的库更新了,python动态库依赖的库也需要同步操作。C++后端的头文件和库变动了,需要更新项目的头文件和库,可以借助md5sum.exe工具加密算法看头文件是不是同一个
更新项目
git pull
加密算法
md5sum.exe一般在项目中 .....\lib\Windows_All_x64\Debug 路径下面
md5sum.exe 客户端接口的库 # md5sum.exe DroneClientApi.dll
重新编译pyd
删除原先的pysocket文件中编译的的build文件以及里面编译的库
在当前路径下编译库
编译器 编译参数 编译文件 debug模式
cmake --build build --config Debug 编译Debug模式
更新依赖库.dll
将更新的库.dll替换python代码中的lib下面的库(Server端和Client端)
3.编译下载动态库的转义符
git 拉取项目代码,\r \n 转义不成功 导致pysocket库 下载失败,pip install ./pysocket 会失败,原因是编译不能识别错误的换行符,解决方案如下面第四点
4. git 多平台换行符问题(LF or CRLF)
由于c++代码,git提交文件使用的行结束符统一是LF,而window上传是默认将换行符替换成CRLF,根据项目统一要求走,如果没有其它要求,就默认上传;项目有统一要求LF,如果将git设置全局的LF。
方法一
将git设置全局的LF ,windown自动会转成crlf
git config --global core.autocrlf true # 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf false # 提交检出均不转换
**方法二: 手动设置文件的换行符为LF **
-
通过编辑器来完成----》利用navicat编辑器或者其他编辑器 将所有头文件的\r\n--->' '
-
使用dos2unix(git bash自动的工具)转换工具进行转换
find . -type f -print0 # 来到incllude目录下,找到所有需要换行的文件 find . -type f -print0 | xargs -0 unix2dos # # LF 转为成CRLF git config --global --list # 查看core.autocrlf=true
5. dos2unix工具
dos2unix是将Windows格式文件转换为Unix、Linux格式的实用命令。Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2unix命令其实就是将文件中的\r\n 转换为\n。而unix2dos则是和dos2unix互为孪生的一个命令,它是将Linux&Unix格式文件转换为Windows格式文件的命令。
find . -type f -print0 | xargs -0 unix2dos # LF 转为成CRLF
find . -type f -print0 | xargs -0 dos2unix # CRLF转换成LF
core.autocrlf=true 检出时,git 会把文本文件的换行符转换为CRLF(只转换纯LF的文件)
使用之前先下载按照dos2unix,如果实在git里面就不需要下载,本身就自带了dos2unix工具包
导入C++的库
c++代码编译成python语言的源代码
1.下载--protoc.ex
将.proto文件编译成python语言的源代码
# 1.将所有.proto文件的打包成一个文件`AAA`
# 2.提前在 python虚拟环境下载编译工具protobuf
pip install protobuf==3.20.3 # protobuf项目要同一个版本的
2.编译
编译c++语言成python语言 统一在编译器protoc.exe所在文件路径下执行
1.找到编译器protoc.exe所在的位置 D:\xxx\xxxx\xxxxx\xxxxx\protobuf\lib\Windows_All_x64\bin>protoc.exe --version # 查看版本号
2.编译单个.proto文件 protoc.exe -I 编译库的文件路径 输出python的文件路径 .proto 文件路径
protoc.exe -ID:\proto --python_out=D:\proto\python D:\proto\DroneInstrumentServer.proto
3.编译多个.proto文件
find /d/proto/ -name *.proto # 查看找需要编译.proto文件
find /d/proto/ -name *.proto -exec ./protoc.exe -I/d/proto --python_out=/d/proto/python {} \; # 编译器路径 .proto路径 输出路径

浙公网安备 33010602011771号