C++/Qt 小知识记录5

工作中遇到的一些小问题,总结的小知识记录:C++/Qt

小知识5

  • Windows下查看端口占用情况
  • C++调用Python三方库
    • 测试库有没有被加上的测试方法
    • 初始化使用Python的env环境,用Py_SetPythonHome设置
    • GDAL相关的,需要把osgeo、rasterio的路径加入到运行环境变量
    • 如果有Qt环境,编译的时候会报错到这个地方,是和Qt的slots宏冲突了
    • C++动态加载Python执行脚本
    • 调试Python运行的小问题
  • VS2022设置cpp和h的切换快捷建:Alt+o设置

Windows下查看端口占用情况

如下为C++的调用实现

#include <Windows.h>
#include <WinSock.h>
#include <tcpmib.h>
#include <IPHlpApi.h>#include <vector>
#include <memory>
#include <algorithm>
#include <iostream>
int CRetransferRequest::GetSupportPort(int nMin, int nMax)
{for (int i = nMin; i <= nMax; i++){unsigned short usPort = (unsigned short)i;SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(usPort);addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(s, (LPSOCKADDR)&addr, sizeof(addr));if (WSAGetLastError() == WSAEADDRINUSE){//端口已被占用continue;}else{return i;}}return rand() % (nMax - nMin) + nMin;
}

同时在cmake中需要配置相关库依赖: ws2_32.lib、IPHlpApi.lib

# cmake下的依赖库
target_link_libraries(${PROJECT_NAME} PRIVATEws2_32.libIPHlpApi.lib
)

C++调用Python三方库

以下是一些在做C++调用Python脚本时遇到的突出问题,或者必要的记录。(如何实现就不详细解说了,网上的教程很完备)

测试库有没有被加上的测试方法

// Try to import
PyObject* pName = PyUnicode_DecodeFSDefault(strModuleName.data());
PyObject* pModule = PyImport_Import(pName);if (pModule != NULL) {// module existsprintf("%s library is available.\n", strModuleName.data());// Clean upPy_DECREF(pModule);
}
else {// ImportError occurredPyErr_Print();fprintf(stderr, "Failed to import %s library.\n", strModuleName.data());
}

初始化使用Python的env环境,用Py_SetPythonHome设置

Py_SetPythonHome(L"../algorithm_py_env");Py_Initialize();
if (!Py_IsInitialized())
{return -1;
}

GDAL相关的,需要把osgeo、rasterio的路径加入到运行环境变量

(假设Python环境在algorithm_py_env目录下)

PyRun_SimpleString("import os");
PyRun_SimpleString("os.environ['PATH'] = '../algorithm_py_env/Lib/site-packages/osgeo;../algorithm_py_env/Lib/site-packages/rasterio;'+os.environ['PATH']");
PyRun_SimpleString("os.environ['PYTHONPATH'] = '../algorithm_py_env/Lib/site-packages/osgeo;../Bin/algorithm_py_env/Lib/site-packages/rasterio;'+os.environ['PATH']");

如果调用的三方py模块,底层使用了C 扩展模块,如:rasterio,需要将ffi.dll系列库放入C++执行目录下,才能import成功。
是否需要显式处理 ffi.dll 取决于库的实现和其对底层资源的依赖
(并非所有的第三方库都需要直接使用 ffi.dll。使用 ffi.dll 主要是在构建和编写自定义的 C 扩展模块时,或者在 Python 中调用外部的 C 函数时才会涉及到。
许多第三方库通常是使用纯 Python 编写的,而不依赖于底层的 C 扩展。这些库在其实现中可能没有直接使用到 ffi.dll 或者其作用是被封装在库内部,因此用户在使用这些库时无需显式地处理 ffi.dll。)

  • C++执行目录需要放入的python相关动态库:
    在这里插入图片描述
  • 有依赖于C模块的py库,加入如下库(conda目录下可以找到):
    在这里插入图片描述

如果有Qt环境,编译的时候会报错到这个地方,是和Qt的slots宏冲突了

在这里插入图片描述

方法1. 把Python.h头文件放在最上面;

方法2. 改python的include/object.h内源码:

  • 把slots宏undef后再define:
  • #undef slots
  • PyType_Slot *slots;
  • #define slots Q_SLOTS

C++动态加载Python执行脚本

如果希望动态执行Python脚本,即每次(或者第二次以及之后)执行PyImport_ImportModule后,执行PyImport_ReloadModule来更新模块的加载。

	PyObject* pModule = NULL;PyObject* pFunc = NULL;PyObject* pArgs = NULL;PyObject* pRet = NULL;pArgs = argsFunc();std::stringstream ss;do{pModule = PyImport_ImportModule(strModule.data());if (pModule == NULL) {ss << strModule << " module not found" << std::endl;break;}if (m_bUseReload){PyImport_ReloadModule(pModule); // 重新加载模块}pFunc = PyObject_GetAttrString(pModule, strFunc.data());if (pFunc == NULL) {ss << strFunc << " function not found" << std::endl;break;}pRet = PyObject_CallObject(pFunc, pArgs);if (pRet){retFunc(pRet);}} while (0);//释放内存if (NULL != pModule) Py_DECREF(pModule);if (NULL != pFunc) Py_DECREF(pFunc);if (NULL != pArgs) Py_DECREF(pArgs);if (NULL != pRet) Py_DECREF(pRet);return ss.str();

调试Python运行的小问题

[16676:0326/204323.820:ERROR:cache_util_win.cc(20)] Unable to move the cache: 拒绝访问。 (0x5)
[16676:0326/204323.820:ERROR:disk_cache.cc(205)] Unable to create cache
在windows下直接执行py文件可能报错,要用 python xxx.py 明确是用python执行

VS2022设置cpp和h的切换快捷建:Alt+o设置

个人习惯,所以特意改了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iOS开发】(一)2024 从一无所有开始,到ios开发(react Native)

​ 2024 从一无所有开始&#xff0c;到ios开发&#xff08;react Native&#xff09; 目录标题 1 工具简介2 基础环境搭建1 安装 brew2 安装 Node.js3 安装 Yarn4 安装 React Native 脚手架 3 ios环境搭建4创建并启动一个app 在这里插入图片描述 1 工具简介 Homebrew (brew)&a…

OpenHarmony实战开发-页面布局检查器ArkUI Inspector使用指导

DevEco Studio内置ArkUI Inspector工具&#xff0c;开发者可以使用ArkUI Inspector&#xff0c;在DevEco Studio上查看应用在真机上的UI显示效果。利用ArkUI Inspector工具&#xff0c;开发者可以快速定位布局问题或其他UI相关问题&#xff0c;同时也可以观察和了解不同组件之间…

Matlab分段微分方程组拟合【案例源码+视频教程】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法&#xff0c;并提供所有案例完整源码&#xff1b;2.…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之③:数据分析之一(智能报表)

概述 在企业数字化转型的过程中&#xff0c;ERP系统与数据平台作为核心支撑工具&#xff0c;对于提升运营效率、优化决策支持、实现业务流程一体化起着至关重要的作用。然而&#xff0c;智能报表与报表的智能化合并作为其中的重要领域&#xff0c;却往往面临诸多挑战与难点&am…

探索 去中心化的Web3.0

随着区块链技术的日益成熟和普及&#xff0c;Web3&#xff08;Web 3.0&#xff09;已经成为一个无法忽视的趋势。Web3不仅仅是一个技术概念&#xff0c;更是一个去中心化、透明、用户数据拥有权归还给用户的互联网新时代。在这篇文章中&#xff0c;我们将深入探讨Web3技术的核心…

纯js图片上传插件

目录标题 一、效果预览二、使用简单三、完整代码&#xff08;一&#xff09;index.html&#xff08;二&#xff09;css&#xff08;三&#xff09;js四、附带后台上传文件代码 一、效果预览 支持多图片上传&#xff0c;删除、预览。 二、使用简单 导入依赖&#xff08;需要…

Dart基础语法

Hello Dart Dart 语言与其他许多编程语言一样&#xff0c;以 main 函数作为程序的入口点。以下是一个简单的 "Hello Dart" 程序示例&#xff0c;展示了 Dart 语言的这一特点。 // 标准写法 void main(){print("Hello Dart"); }// 省略写法 main(){print(&…

WebGL绘制和变换三角形

1、绘制多个点 构建三维模型的基本单位是三角形。不管三维模型的形状多么复杂&#xff0c;其基本组成部分都是三角形&#xff0c;只不过复杂的模型由更多的三角形构成而已。 gl.vertexAttrib3f()一次只能向顶点着色器传入一个顶点&#xff0c;而绘制三角形、矩形和立方体等&am…

【网络安全】HTTP协议 — 特点

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 学习目标​ 一、请求与响应 1.服务器和客户端 二、不保存状态 1.不保存状态的协议 三、资源定位 1.URI&#xff08;统一资源标识符&#xff09; 四、请求方法 1.请求方法 五…

如何在window系统中安装Mysql

先简单来说说MySQL是什么&#xff1f; MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一。 MySQL 由瑞典 MySQL AB 公司开发&#xff0c;目前属于…

多模态模型训练QA

Q&#xff1a;InternLM-XComposer的最新版本把vit的参数量降低了但是效果好了&#xff0c;所以好奇scale up vision encoder的收益大么&#xff1f;还是说重点是一个好的llm&#xff1f; A&#xff1a;结论是二者同步扩大才会起作用。我们试下来结论是llm 7b情况下&#xff0c…

利用AI知识库,优化医保系统售后信息管理流程

在医疗行业中&#xff0c;传统知识库管理虽能整合医疗行业知识&#xff0c;但搜索和管理效率有限&#xff0c;导致医护人员难以高效利用。特别是面对医保系统等复杂系统时&#xff0c;他们常需依赖人工客服或繁琐的电子产品手册解决问题。而HelpLook AI知识库利用AI技术&#x…

中国人民解放军信息支援部队成立

中国人民解放军信息支援部队成立 ----------强化信息化战争能力&#xff0c;维护国家安全 阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或…

基于 Win32 编程,使用 C语言开发一个记事本。

现在 Win32 非常少见&#xff0c;因为太原始了&#xff0c;同时也因为高级语言做应用开发速度更快。但是用 C 语言开发一个 win32 记事本对于理解应用程序运行的内部原理还是很有帮助的&#xff0c;“最基础的就是最有用的”&#xff0c;Windows 编程圣经 《Windows 程序设计》…

HCIP学习笔记

个人学习hcip笔记 供参考 笔记有些乱 之后还会修改完善并添加其他篇幅 OSPF篇 OSPF采用组播方式发送hello包&#xff0c;组播地址为224.0.0.5 相关&#xff1a; 所有节点&#xff1a;224.0.0.1&#xff1b; 所有路由器&#xff1a;224.0.0.2&#xff1b; OSPF DRO发给DR&…

tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性 很久以前我开始纠结 tcp 锯齿&#xff0c;很多年后我知道这叫 capacity-seeking&#xff0c;甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为&#xff0c;而该行为生成了 tcp 锯齿。 在消除锯齿&#xf…

裸金属服务器和物理机有什么区别

今天&#xff0c;在我们生活的世界中&#xff0c;技术已经彻底改变了我们的生活。在开展在线业务时&#xff0c;服务器在快速高效地执行多项任务方面发挥了极其重要的作用。然而&#xff0c;很多人仍然对裡金属服务器和物理机感到很困惑。今天就给大家分析一下裡金属服务器和物…

算法训练营day15

一、层序遍历 参考链接7.2 二叉树遍历 - Hello 算法 (hello-algo.com) 层序遍历本质上属于广度优先遍历&#xff0c;也称广度优先搜索&#xff0c; BFS通常借助队列的先入先出的特性实现 参考链接102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 像这种较为…

利用技术优化医保购药体验:开发医保购药APP

为了解决线下医保买药繁琐的流程&#xff0c;利用技术优化医保购药体验成为了当务之急。因此&#xff0c;今天小编将为大家详解如何开发一款医保购药APP。 一、背景与意义 购药流程繁琐、耗时、信息不透明等问题日益凸显&#xff0c;亟需一种新的解决方案。开发医保购药APP可以…

【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 成员变量缺省值 结语 前言 本篇主要内容&#xff1a;类的六个默认成员函数中…