Qt Creator 通过python解释器调用*.py

全是看了大佬们的帖子,结合chatGPT才揉出来。在此做个记录。

  1. 安装python
  2. 在Qt Creator *.pro 文件中配置好环境
  3. 来个简单的example.py
  4. 调用代码
  5. 安装pip
  6. 添加opencv等库
  7. 调用包含了opencv库的py代码
  8. 成功

*.pro配置:

INCLUDEPATH += C:\Users\xuanm\AppData\Local\Programs\Python\Python312\include
LIBS      += -LC:\Users\xuanm\AppData\Local\Programs\Python\Python312\libs  -lpython312

example.py源码:

# example.py
def add(a, b):return a + b

Qt Creator里面调用example.py的C++函数:


int MainWindow::testPy()
{const wchar_t * pythonHome = L"C:/Users/xuanm/AppData/Local/Programs/Python/Python312";Py_SetPythonHome(pythonHome);// 初始化 Python 解释器Py_Initialize();// 添加目录到 Python 模块搜索路径PyObject* sysPath = PySys_GetObject("path");PyObject* pPath = PyUnicode_FromString("C:/temp");PyList_Append(sysPath, pPath);Py_DECREF(pPath);  // 释放引用// 导入 Python 脚本PyObject* pModule = PyImport_ImportModule("example");if (!pModule) {PyErr_Print();std::cerr << "Failed to load module." << std::endl;return 1;}// 获取函数对象PyObject* pFunc = PyObject_GetAttrString(pModule, "add");if (!pFunc || !PyCallable_Check(pFunc)) {PyErr_Print();std::cerr << "Failed to get function." << std::endl;return 1;}// 准备参数PyObject* pArgs = PyTuple_Pack(2, PyLong_FromLong(5), PyLong_FromLong(3));// 调用函数PyObject* pValue = PyObject_CallObject(pFunc, pArgs);if (pValue) {// 打印结果std::cout << "Result: " << PyLong_AsLong(pValue) << std::endl;Py_DECREF(pValue);} else {PyErr_Print();std::cerr << "Function call failed." << std::endl;}// 清理Py_XDECREF(pFunc);Py_XDECREF(pModule);Py_XDECREF(pArgs);// 结束 Python 解释器Py_Finalize();
}

含opencv库的*.py:

#-*- coding: utf-8 -*-import os.path
import copy
import cv2
import numpy as np# 椒盐噪声
def SaltAndPepper(src, percetage):SP_NoiseImg = src.copy()SP_NoiseNum = int(percetage * src.shape[0] * src.shape[1])for i in range(SP_NoiseNum):randR = np.random.randint(0, src.shape[0] - 1)randG = np.random.randint(0, src.shape[1] - 1)randB = np.random.randint(0, 3)if np.random.randint(0, 1) == 0:SP_NoiseImg[randR, randG, randB] = 0else:SP_NoiseImg[randR, randG, randB] = 255return SP_NoiseImg# 高斯噪声
def addGaussianNoise(image, percetage):G_Noiseimg = image.copy()w = image.shape[1]h = image.shape[0]G_NoiseNum = int(percetage * image.shape[0] * image.shape[1])for i in range(G_NoiseNum):temp_x = np.random.randint(0, h)temp_y = np.random.randint(0, w)G_Noiseimg[temp_x][temp_y][np.random.randint(3)] = np.random.randn(1)[0]return G_Noiseimg# 昏暗
def darker(image, percetage=0.9):image_copy = image.copy()w = image.shape[1]h = image.shape[0]# get darkerfor xi in range(0, w):for xj in range(0, h):image_copy[xj, xi, 0] = int(image[xj, xi, 0] * percetage)image_copy[xj, xi, 1] = int(image[xj, xi, 1] * percetage)image_copy[xj, xi, 2] = int(image[xj, xi, 2] * percetage)return image_copy# 亮度
def brighter(image, percetage=1.5):image_copy = image.copy()w = image.shape[1]h = image.shape[0]# get brighterfor xi in range(0, w):for xj in range(0, h):image_copy[xj, xi, 0] = np.clip(int(image[xj, xi, 0] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 1] = np.clip(int(image[xj, xi, 1] * percetage), a_max=255, a_min=0)image_copy[xj, xi, 2] = np.clip(int(image[xj, xi, 2] * percetage), a_max=255, a_min=0)return image_copy# 旋转
def rotate(image, angle, center=None, scale=1.0):(h, w) = image.shape[:2]# If no rotation center is specified, the center of the image is set as the rotation centerif center is None:center = (w / 2, h / 2)m = cv2.getRotationMatrix2D(center, angle, scale)rotated = cv2.warpAffine(image, m, (w, h))return rotated# 翻转
def flip(image):flipped_image = np.fliplr(image)return flipped_imagedef work(file_dir):
# 图片文件夹路径for img_name in os.listdir(file_dir):img_path = file_dir + '\\' + img_nameimg = cv2.imread(img_path)# cv2.imshow("1",img)# cv2.waitKey(5000)# 旋转rotated_90 = rotate(img, 90)cv2.imwrite(file_dir +'\\'+ img_name[0:-4] + '_r90.jpg', rotated_90)# rotated_180 = rotate(img, 180)# cv2.imwrite(file_dir +'\\'+ img_name[0:-4] + '_r180.jpg', rotated_180)# for img_name in os.listdir(file_dir):#     img_path = file_dir + img_name#     img = cv2.imread(img_path)#     镜像#     flipped_img = flip(img)#     cv2.imwrite(file_dir +'\\' + img_name[0:-4] + '_fli.jpg', flipped_img)## # 增加噪声# img_salt = SaltAndPepper(img, 0.3)#   cv2.imwrite(file_dir + '\\' + img_name[0:-4] + '_salt.jpg', img_salt)#  img_gauss = addGaussianNoise(img, 0.3)#  cv2.imwrite(file_dir +'\\' +  img_name[0:-4] + '_noise.jpg', img_gauss)## # 变亮、变暗# img_darker = darker(img)# cv2.imwrite(file_dir +'\\' + img_name[0:-4] + '_darker.jpg', img_darker)# img_brighter = brighter(img)# cv2.imwrite(file_dir + '\\' + img_name[0:-4] + '_brighter.jpg', img_brighter)## blur = cv2.GaussianBlur(img, (7, 7), 1.5)# #      cv2.GaussianBlur(图像,卷积核,标准差)# cv2.imwrite(file_dir + img_name[0:-4] + '_blur.jpg', blur)

调用含opencv库的*.py C++函数:


int MainWindow::testYBZQ()
{const wchar_t * pythonHome = L"C:/Users/xuanm/AppData/Local/Programs/Python/Python312";Py_SetPythonHome(pythonHome);// 初始化 Python 解释器Py_Initialize();// 添加目录到 Python 模块搜索路径PyObject* sysPath = PySys_GetObject("path");PyObject* pPath = PyUnicode_FromString("C:/temp");PyList_Append(sysPath, pPath);Py_DECREF(pPath);  // 释放引用// 添加标准库路径PyObject* stdLibPath = PyUnicode_FromString("C:/Users/xuanm/AppData/Local/Programs/Python/Python312/libs");PyList_Append(sysPath, stdLibPath);Py_DECREF(stdLibPath);// 添加 site-packages 路径PyObject* sitePackagesPath = PyUnicode_FromString("C:/Users/xuanm/AppData/Local/Programs/Python/Python312/Lib/site-packages");PyList_Append(sysPath, sitePackagesPath);Py_DECREF(sitePackagesPath);// 导入 Python 脚本PyObject* pModule = PyImport_ImportModule("data_augmentation");if (!pModule) {PyErr_Print();std::cerr << "Failed to load module." << std::endl;return 1;}// 获取函数对象PyObject* pFunc = PyObject_GetAttrString(pModule, "work");if (!pFunc || !PyCallable_Check(pFunc)) {PyErr_Print();std::cerr << "Failed to get function." << std::endl;return 1;}// 准备参数std::string strParam = "C:/temp/sar_sample";PyObject* pStrParam = PyUnicode_FromString(strParam.c_str());PyObject* pArgs = PyTuple_Pack(1, pStrParam);// 调用函数PyObject* pValue = PyObject_CallObject(pFunc, pArgs);if (pValue) {// 打印结果std::cout << "Result: " << PyLong_AsLong(pValue) << std::endl;Py_DECREF(pValue);} else {PyErr_Print();std::cerr << "Function call failed." << std::endl;}// 清理Py_XDECREF(pFunc);Py_XDECREF(pModule);Py_XDECREF(pArgs);// 结束 Python 解释器Py_Finalize();
}

程序运行出了正确结果,报错:

Result: -1
TypeError: 'NoneType' object cannot be interpreted as an integer

再次感谢各位大佬的帖子,谢谢。

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

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

相关文章

wordpress在页面中调用另外一个页面的内容

在WordPress中&#xff0c;一个页面调用另一个页面的内容通常不是WordPress设计的直接功能&#xff0c;因为WordPress的页面和内容通常是独立管理的。不过&#xff0c;你可以通过几种方法来实现这一需求&#xff1a; 1. 使用WordPress的短代码(Shortcodes) 你可以创建一个自定…

操作系统中的并发控制——使用条件变量同步

本期主题&#xff1a; 操作系统中的并发控制&#xff0c;条件变量 往期链接&#xff1a; linux设备驱动中的并发操作系统中的多线程问题——原子操作、自旋锁的底层实现操作系统并发控制——使用互斥锁实现同步 操作系统并发控制之条件变量同步 1. 问题描述2. 条件变量的API讲…

Netty的线程模型

Netty的线程模型是其核心特性之一&#xff0c;主要包括以下几个方面&#xff1a; 线程模型概述 作用与重要性&#xff1a;线程模型决定了代码在操作系统、编程语言和框架中的执行方式&#xff0c;对于处理多线程相关的问题至关重要。在网络编程中&#xff0c;合理的线程模型可…

云栖实录 | Hologres3.0全新升级:一体化实时湖仓平台

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 姜伟华 | 阿里云智能集团资深技术专家、Hologres 负责人 丁 烨 | 阿里云智能集团产品专家、Hologres 产品负责人 活动&#xff1a; 2024 云栖大会 - 商用大数据计算与分析平台论…

Python中的数据可视化:从入门到进阶

数据可视化是数据分析和科学计算中的重要环节&#xff0c;它通过图形化的方式呈现数据&#xff0c;使复杂的统计信息变得直观易懂。Python提供了多种强大的库来支持数据可视化&#xff0c;如Matplotlib、Seaborn、Plotly等。本文将从基础到进阶&#xff0c;详细介绍如何使用这些…

[单master节点k8s部署]31.ceph分布式存储(二)

Ceph配置 Ceph集群通常是一个独立的存储集群&#xff0c;可以部署在 Kubernetes 集群之外。Ceph 提供分布式存储服务&#xff0c;能够通过 RADOS、CephFS、RBD&#xff08;块存储&#xff09;、和 RGW&#xff08;对象存储&#xff09;等方式与 Kubernetes 集成。即使 Ceph 部…

逼近理论及应用精解【9】

文章目录 全卷积模型定义数学原理与公式架构典型结构应用优点挑战例题 ANNSENet&#xff08;Squeeze-and-Excitation Networks&#xff09;定义数学原理与公式计算定理架构例子例题 ResNet&#xff08;残差网络&#xff09;定义数学原理与公式计算定理算法过程架构例子例题 参考…

PostgreSQL学习笔记五:数据库基本操作

在 PostgreSQL 中&#xff0c;您可以执行一系列基础操作来管理数据库、备份和恢复数据。以下是一些常用的命令和步骤&#xff1a; 创建数据库 使用以下命令创建新数据库&#xff1a; CREATE DATABASE database_name;您也可以在创建时指定数据库所有者和其他参数&#xff1a;…

基于深度学习的手势控制模型

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 1. 项目简…

Nexpose 6.6.271 发布下载,新增功能概览

Nexpose 6.6.271 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 26, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.or…

安全工具 | 搭建带有 Web 仪表板的Interact.sh

介绍 Interactsh 是一个用于检测带外交互的开源工具。它是一种旨在检测导致外部交互的漏洞的工具。本文将主要介绍在子域上设置私有 Interact.sh 服务器以及部署其 Web 应用程序。只需一个 AWS EC2 或 VPS 实例和一个域。 要求 •具有静态IP的AWS EC2 / VPS •拥有自己的域…

实例讲解电动汽车VIN写入规则及Simulink建模方法(三)——VIN设置状态反馈及Simulink建模方法

目录 一、整车VIN设置状态反馈规则 二、整车VIN设置状态反馈设置策略 1、VIN设置状态判定 2、VIN设置状态反馈发送 三、整车VIN设置状态反馈Simulink建模 1、VIN设置状态判定 2、VIN设置状态反馈发送 3、整车VIN设置状态反馈设置完整Simulink模型 四、总结 一、整车VI…

python 实现最短路径广度优先搜索算法

最短路径广度优先搜索算法介绍 最短路径广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;算法通常不直接用于寻找加权图中的最短路径&#xff0c;因为它在搜索过程中不会考虑边的权重。然而&#xff0c;在无权图中&#xff08;即所有边的权重都相等&#xff09…

Lua在Nginx中的开发实践

Lua在Nginx中的开发实践 引言 在现代Web开发中&#xff0c;性能和可扩展性是开发者关注的关键因素。Nginx因其轻量级、高并发处理能力而成为流行的Web服务器&#xff0c;而Lua则是一种高效的脚本语言&#xff0c;广泛应用于嵌入式系统和游戏开发。将Lua与Nginx结合&#xff0…

Node.js入门——fs、path模块、URL端口号、模块化导入导出、包、npm软件包管理器

Node.js入门 1.介绍 定义&#xff1a;跨平台的JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序作用&#xff1a;使用Node.Js编写服务器端代码Node.js是基于Chrome V8引擎进行封装&#xff0c;Node中没有BOM和DOM 2.fs模块-读写文件 定义&#xff1a;封装了与…

WIFI网速不够是不是光猫的“路由模式”和“桥接模式”配置错了?

光猫&#xff08;光纤调制解调器&#xff09;是一种用于将光纤信号转换为数字信号的设备&#xff0c;通常用于家庭或企业网络中。光猫可以在不同的工作模式下运行&#xff0c;其中最常见的两种模式是“路由模式”和“桥接模式”。以下是这两种模式的详细解释及其优缺点。 一、路…

python发邮件附件:配置SMTP服务器与认证?

python发邮件附件技巧&#xff1f;Python发送多附件邮件的方法&#xff1f; Python作为一种强大的编程语言&#xff0c;提供了丰富的库和工具来实现这一功能。AokSend将深入探讨如何使用Python发邮件附件&#xff0c;并详细介绍配置SMTP服务器与认证的关键步骤。 python发邮件…

结合vueuse实现图片懒加载

介绍 为什么要有懒加载&#xff1f; 在一个网页中如果有很多张图片&#xff0c;那么用户初进这个页面的时候不必一次性把所有图片都加载出来&#xff0c;否则容易造成卡顿和浪费。应该是&#xff0c;用户的视图页面滑到该图片的位置&#xff0c;然后再把该图片加载出来。 前置…

通过阿里云Milvus与PAI搭建高效的检索增强对话系统

阿里云Milvus现已无缝集成于阿里云PAI平台&#xff0c;一站式赋能用户构建高性能的RAG&#xff08;Retrieval-Augmented Generation&#xff09;对话系统。您可以利用Milvus作为向量数据的实时存储与检索核心&#xff0c;高效结合PAI和LangChain技术栈&#xff0c;实现从理论到…

Java 设计模式 构建者模式

文章目录 1 概念2 使用方法1 创建步骤&#xff1a;2 使用步骤&#xff1a; 参考 1 概念 builder模式又叫建造者模式&#xff0c;属于创建型模式 作用&#xff1a;将一个复杂对象的构建与他的表示分离&#xff0c;可以一步一步构建对象&#xff0c;而不是使用构造函数构造一次…