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://xiahunao.cn/news/2979413.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一款辅助应用助力盲人公交出行畅行无阻

在这个日新月异的时代&#xff0c;科技进步正以前所未有的速度改变着人们的生活方式&#xff0c;尤其是在提升特殊群体生活质量方面展现出巨大潜力。今日&#xff0c;我们将目光聚焦于盲人公交出行&#xff0c;探讨一款名叫蝙蝠避障的创新辅助应用如何以其实时避障与拍照识别功…

聊聊 Linux iowait

哈喽大家好&#xff0c;我是咸鱼。 我们在使用 top 命令来查看 Linux 系统整体 CPU 使用情况的时候&#xff0c;往往看的是下面这一列&#xff1a; %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 68.0 wa, 0.0 hi, 0.0 si, 0.0 st其中&#xff0c;man 手册解释 wa 表示 …

mac电脑搭建vue环境(上篇)

第一步&#xff1a;mac电脑要有homebrew&#xff0c;如何安装homebrew 点击下方 MAC安装homebrew-CSDN博客 第二步&#xff1a;homebrew安装node.js 第三步&#xff1a;安装npm 第四步&#xff1a;安装webpack 第五步&#xff1a;安装vue脚手架 第六步&#xff1a;可以在…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

Python-VBA函数之旅-input函数

目录 一、input函数的常见应用场景&#xff1a; 二、input函数使用注意事项&#xff1a; 三、如何用好input函数&#xff1f; 1、input函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博…

Git命令行操作(本地操作)

入口 1、任意目录》鼠标右键》Open Git Bash here 2、桌面快捷方式 本地库初始化 在本地库项目文件夹执行命令:git init 验证是否执行成功 .git目录中存放的是本地库相关的子目录和文件,不要删除、修改 设置签名 1、形式 用户名:tom Email地址:GoodMorning@qq.com 2、作…

cdp集群主节点根目录磁盘扩容

查看挂载点 df -h可以看到&#xff0c;根目录容量只有37G&#xff0c;现在对根目录进行扩容 查看根目录挂载的磁盘大小 lsblk挂载磁盘名字为vda&#xff0c;磁盘容量有80G&#xff0c;现在磁盘使用量为vda下面三个分区vda1&#xff0c;vda2&#xff0c;vda3容量之和&#xf…

AI测试干货!实例讲解AI自动生成测试用例

1.引言 在软件开发过程中&#xff0c;测试用例的生成是至关重要的一步。测试用例是用于验证软件功能、性能和安全性的具体测试方法&#xff0c;是确保软件质量的关键手段。 随着人工智能&#xff08;AI&#xff09;技术的发展&#xff0c;基于AI的测试用例生成技术逐渐成为未…

报销管理如何秒变高效神器?

一、客户介绍 易快报作为业界知名的企业报销管理平台&#xff0c;一直致力于为企业提供高效、便捷的报销服务。随着业务的不断扩展&#xff0c;易快报面临着与多个外部系统进行数据交互的需求&#xff0c;以提升工作效率和减少数据差错。中信建投作为国内领先的金融机构&#…

Docker镜像与容器操作

一、Docker 镜像操作 1.1 搜索镜像 格式&#xff1a;docker search 关键字 docker search nginx 1.2 获取镜像nginx 格式&#xff1a;docker pull 仓库名称[:标签] 如果下载镜像时不指定标签&#xff0c;则默认会下载仓库中最新版本的镜像&#xff0c;即选择标签为 latest…

DOM4标准的事件监听与滚屏优化

EventTarget.addEventListener() 我们在学习addEventListener()时都只是知道它是用来给事件注册事件处理函数的。但是这种描述并不是很准确&#xff0c;MDN上给我们准确的描述了它的定义。EventTarget.addEventListener()方法将指定的监听器注册到EventTarget上&#xff0c;当…

字符长、看不懂、费率飙升|Runes协议上线后发生了什么?

作者&#xff1a;比特里里 X/推&#xff1a;lilyanna_btc 1、字符数长了&#xff0c;单词都完整了&#xff0c;反而看不懂了 由于 Runes 协议的字符长度限制&#xff0c;大部分的票都在 13 个字符及以上&#xff0c;人名、域名、slogan&#xff0c;各类玩法都出来了。很多人适…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中&#xff0c;以GPT4、Claude3、Llama 3等大型语言模型&#xff08;LLM&#xff09;无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练&#xff0c;学习到了丰富的语言知识和模式&#xff0c;展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

JS----前端不同格式的 UUID生成

前端 UUID生成 export const generateUUID () > {let timestamp new Date().getTime()let performanceNow (typeof performance ! undefined && performance.now && performance.now() * 1000) || 0return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replac…

免费好用的AI绘画生成器推荐,建议收藏!

AI绘画生成器可以根据设计师的需求生成各种风格、主题的绘画作品&#xff0c;无论是现代抽象&#xff0c;还是古典风景&#xff0c;都能应有尽有。任何人只需几步简单操作&#xff0c;都可以轻松使用这款工具&#xff0c;就能生成出令人惊艳的作品。那么免费好用的AI绘画生成器…

docker部署通义千问-7B-Chat的openai-api环境

服务器环境&#xff1a; 显卡驱动&#xff1a;Driver Version: 530.30.02 CUDA版本&#xff1a;CUDA Version: 12.1 显卡&#xff1a;NVIDIA GeForce RTX 3090共4张 注意&#xff1a;最好把显卡驱动升级到530&#xff0c;CUDA版本之前使用11.7有问题。 一、下载模型文件 …

Linux之安装Nginx

目录 传送门前言一、快速安装二、反向代理语法1、基本语法2、location语法1. 基本语法2. 匹配规则3. 修饰符4. 权重5. 嵌套location6. 其他指令7.案例 三、配置反向代理 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff0…

2024年深圳杯东三省数学建模联赛A题论文首发第二种思路

深圳杯A题论文代码分享资料链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1L2NVgoefSW-yuqZjEB3wcw 提取码&#xff1a;sxjm 问题一 数据转换&#xff1a; 首先&#xff0c;我们将监测站的经纬度坐标转换为基于米的笛卡尔坐标系。这是因为在地面上的大尺度距离…

selenium‘拟人包装‘设置

1、设置header,proxy 1.1关于user-agent 输入about:version 找到user-agent: import requests # 引用requests库 from selenium import webdriver#载入浏览器驱动#header&#xff0c;proxy设置 optionswebdriver.ChromeOptions()#实例化浏览器参数设置options.add_argument…

探索深度与广度的平衡:迭代加深深度优先搜索技术解析

探索深度与广度的平衡&#xff1a;迭代加深深度优先搜索技术解析 迭代加深深度优先搜索&#xff08;IDDFS&#xff09;的基本原理伪代码C语言实现讨论结论 迭代加深&#xff08;Iterative Deepening Depth-First Search, IDDFS&#xff09;是一种用于解决搜索问题的方法&#x…