Welcome to kimi's blog

python联调c++和QT

python做代理层,连接c++和QT

python调用c代码,方式很多,本章借助于pybind11

准备工作

  1. 将c++代码编译成动态库.so库或.pyd
  2. python使用pip工具,直接下载动态库到解释器环境
  3. 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

  1. 删除原先的pysocket文件中编译的的build文件以及里面编译的库

  2. 在当前路径下编译库

编译器 编译参数 编译文件 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 **

  1. 通过编辑器来完成----》利用navicat编辑器或者其他编辑器 将所有头文件的\r\n--->' '

  2. 使用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路径  输出路径
posted @ 2023-09-06 23:36  魔女宅急便  阅读(186)  评论(0)    收藏  举报
Title