使用qtquick调用python程序,pytorch

一. 内容简介

使用qtquick调用python程序

二. 软件环境

2.1vsCode

2.2Anaconda

version: conda 22.9.0

2.3pytorch

安装pytorch(http://t.csdnimg.cn/GVP23)

2.4QT 5.14.1

新版QT6.4,,6.5在线安装经常失败,而5.9版本又无法编译64位程序,所以就采用5.14.1这个用的比较多也比较稳定的一个版本。

QT编译器采用的是MSVC2017 64bit。

链接:https://pan.baidu.com/s/1ER98DPAkTUPlIyCC6osNNQ?pwd=1234

三.主要流程

3.1 qml中调用c++程序

qml里面不能直接调用python,有那个调命令行然后执行py文件的,我感觉很奇怪,就没用那种方式,就采用c++调用python程序。
首先创建一个c++类,基于QObject对象,名字随便起,我用的是mopsopy,
在这里插入图片描述
完成以后,可以直接在我的模板上面改,就是需要在类的成员上加一些声明,让qml认识,但是变量的那个可以用alt加enter加出来,我的没有那个选项,你们可以直接用用我的模板

头文件

#ifndef MOPSOPY_H
#define MOPSOPY_H

#include <QObject>
#include <QDate>
#include <QtQml>
#include <QDebug>

class MopsoPy : public QObject
{
    Q_OBJECT
    // 用于qml内部识别
    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
public:
    explicit MopsoPy(QObject *parent = nullptr);
    ~MopsoPy();
    QString getName() const;
    void setName(const QString &name);

    Q_INVOKABLE void func();
signals:
    void nameChanged(QString name);
public slots:

private:
    QString name;
};

#endif // MOPSOPY_H

cpp文件

#include "mopsopy.h"


MopsoPy::MopsoPy(QObject *parent) : QObject(parent)
{
}

MopsoPy::~MopsoPy()
{

}


QString MopsoPy::getName() const
{
    return name;
}

void MopsoPy::setName(const QString &name)
{
    if (this->name == name)
        return;
    this->name = name;
    emit nameChanged(this->name);
}

void MopsoPy::func()
{
}

完事后,要在main.cpp中注册一下,头文件别忘记了加

#include "mopsopy.h"

qmlRegisterType<MopsoPy>("MopsoPy", 1, 0, "MopsoPy");

qml文件中使用,测试代码自己写吧

import MopsoPy 1.0

    MopsoPy{
        id: mopsoPy;
        name: "jjjj"
        Component.onCompleted: {
            mopsoPy.func()
        }
    }

3.2 c++调用python

首先,添加库的地址,换成自己的

INCLUDEPATH+=D:\Anaconda3\include  #pythonenviroment
LIBS+=-LD:\Anaconda3\libs
-l_tkinter
-lpython3
-lpython39

qt里面创建python文件,

import numpy as np
def add(a,b):
    # 创建日志文件
    fileLog = open("log.txt", "w")
    arr1 = np.array([1, 2, 3, 4, 5])
    # 写入日志
    fileLog.write(np.array2string(arr1))
    # 写入日志
    fileLog.write("写入完成")

    # 关闭文件
    fileLog.close()
    return a+b

c++方法实现
头文件

// 不加会关键字重复,报错
#undef slots
#include <Python.h>
#define slots Q_SLOTS

cpp文件这么写

void MopsoPy::func()
{

   // 新建一个元组,用来存放函数参数的值
   if( !Py_IsInitialized()){     Py_Initialize();}
   // 导入 Python 模块
   PyObject* pModule = PyImport_ImportModule("ccc");

   // 获取模块中的函数对象
   PyObject* pFunc = PyObject_GetAttrString(pModule, "add");

   // 创建参数元组
   PyObject* pArgs = PyTuple_New(2);
   int num1 = 42;
   int num2 = 13;
   // 这个i对应不同的数据格式
   PyObject* arg1 = Py_BuildValue("i", num1);
   PyObject* arg2 = Py_BuildValue("i", num2);
   PyTuple_SetItem(pArgs, 0, arg1);
   PyTuple_SetItem(pArgs, 1, arg2);

   // 调用函数并获取返回值
   PyObject* pResult = PyObject_CallObject(pFunc, pArgs);

   // 解析返回值
   double result;
   PyArg_Parse(pResult, "d", &result);

   // 打印结果
   printf("Result: %f\n", result);

   // 释放资源
   Py_DECREF(pModule);
   Py_DECREF(pFunc);
   Py_DECREF(pArgs);
   Py_DECREF(pResult);

   Py_Finalize();
}

最后把文件放到要执行的文件里面,不然会报找不到文件的,放到release里面就行(我用多个release编译的),我外面也扔了一个,
在这里插入图片描述结果,另外两个不用管,是我的其他模块出的。
在这里插入图片描述

3.3 调用复杂的python程序,读取神经网络

神经网络的模型保存以及读取

# 保存神经网络,这个只是保存训练的参数的
torch.save(model,'angelminLoss.pkl')

# 神经网络的结构,因为读取只是读取参数,
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        # 这个是有wx+b
        self.linear1 = torch.nn.Linear(2, 56)
        self.linear2 = torch.nn.Linear(56, 56)
        self.linear3 = torch.nn.Linear(56, 56)
        self.linear4 = torch.nn.Linear(56, 28)
        self.linear5 = torch.nn.Linear(28, 14)
        self.linear6 = torch.nn.Linear(14, 4)
        self.linear7 = torch.nn.Linear(4, 1)
        self.ReLU = torch.nn.ReLU() # 将其看作是网络的一层,而不是简单的函数使用
        self.Sigmoid = torch.nn.Sigmoid()
 
    def forward(self, x):
        x =  self.ReLU(self.linear1(x))
        x =  self.ReLU(self.linear2(x)) 
        x =  self.ReLU(self.linear3(x))
        x =  self.ReLU(self.linear4(x))
        x =  self.ReLU(self.linear5(x))
        x =  self.ReLU(self.linear6(x))
        x =  self.linear7(x)
        return x
# 读取神经网络参数,没有结构
model = torch.load('angelminLoss.pkl')

下面是测试的py文件test.py,

import numpy as np
import torch
import matplotlib.pyplot as plt
from IPython import display
from d2l import torch as d2l
import os

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        # 这个是有wx+b
        self.linear1 = torch.nn.Linear(5, 56)
        self.linear2 = torch.nn.Linear(56, 56)
        self.linear3 = torch.nn.Linear(56, 56)
        self.linear4 = torch.nn.Linear(56, 28)
        self.linear5 = torch.nn.Linear(28, 14)
        self.linear6 = torch.nn.Linear(14, 5)
        self.linear7 = torch.nn.Linear(5, 1)
        self.ReLU = torch.nn.ReLU()  # 将其看作是网络的一层,而不是简单的函数使用
        self.Sigmoid = torch.nn.Sigmoid()

    def forward(self, x):
        x = self.ReLU(self.linear1(x))
        x = self.ReLU(self.linear2(x))
        x = self.ReLU(self.linear3(x))
        x = self.ReLU(self.linear4(x))
        x = self.ReLU(self.linear5(x))
        x = self.ReLU(self.linear6(x))
        x = self.linear7(x)
        return x

def init():
    model = Model()
    modelFF = torch.load("hminLoss.pkl")
    print("success_1")

if __name__ == "__main__":
    model = Model()
    modelFF = torch.load("hminLoss.pkl")
    print("success_2")

可以看到运行没有问题的,单独运行test.py
在这里插入图片描述
但是现在存在一个问题,当调用当前文件时候,qt里面会报这个错,如果没有报错的,直接闪退的话,可以让他打印错误信息

   // 新建一个元组,用来存放函数参数的值
    if( !Py_IsInitialized()){     Py_Initialize();}
    // 导入包含你的 Python 类的模块
    PyObject* pModule = PyImport_ImportModule("ccc");
    PyErr_Print(); // 打印 Python 异常信息
    // 获取模块中的函数对象
    PyObject* pFunc = PyObject_GetAttrString(pModule, "init");
    PyErr_Print(); // 打印 Python 异常信息

    // 创建参数元组
    PyObject* pArgs = PyTuple_New(0);
 //   int num1 = 42;
 //   int num2 = 13;
 //   PyObject* arg1 = Py_BuildValue("i", num1);
 //   PyObject* arg2 = Py_BuildValue("i", num2);
 //   PyTuple_SetItem(pArgs, 0, arg1);
 //   PyTuple_SetItem(pArgs, 1, arg2);

    // 调用函数并获取返回值
    PyObject* pResult = PyObject_CallObject(pFunc, pArgs);

    // 释放资源
    PyErr_Print(); // 打印 Python 异常信息
    // 解析返回值
    double result;
    PyArg_Parse(pResult, "d", &result);

    // 打印结果
    printf("Result: %f\n", result);

    // 释放资源
    PyErr_Print(); // 打印 Python 异常信息
    Py_Finalize();

在这里插入图片描述
AttributeError: Can’t get attribute ‘Model’ on <module ‘main’ (built-in)>在我们自己单独运行时候是没有报错的。
当我们把文件改成这样,就会报相同的错误,就是torch.load(“hminLoss.pkl”)在导入参数时候,他是没有得到神经网络的结构了,所以报错。我一开始以为是我们c++调用python时候,只会运行导入的函数,没有执行那个Model类,所以会报错,其实不是的,因为在用numpy时候,import导入以后下下面可以直接用,而且上面Model类也可以实例出对象,这就说明其实网络结构应该是有的,但是他拿不到,在调用时候会把import和类这些先运行一下的。

import numpy as np
import torch
import matplotlib.pyplot as plt
from IPython import display
from d2l import torch as d2l
import os

def init():
    model = Model()
    modelFF = torch.load("hminLoss.pkl")
    print("success_1")

if __name__ == "__main__":
    model = Model()
    modelFF = torch.load("hminLoss.pkl")
    print("success_2")

后来我就把网格结构单独放在一个py文件,作为一个模块导入进去,也还是这个问题,单独文件运行都没报错,作为模块导入就会报错,就发现其实PyObject_GetAttrString(pModule, “init”),他其实和import init from pModule是一样的,知道这点以后,我们将其当成一个模块,在其他py文件导入,报错如下
在这里插入图片描述


# 如果当前执行的是这文件的话,就有__name__= "__main__,
# 我们看报错信息 Can't get attribute 'Model' on <module '__main__' from,里面有一个__mian__
# 就是在当前文件中声明类Model时候,会往__main__中挂载一些信息,然后torch.load会去__main__里面拿,在当前文件中运行的话,都是可以获取到的
# 所以不会报错,但是作为模块导入时候,__main__其实已经变了,当前文件中__main__是没有网络结构信息的,他又不能去导入模块的__main__
# 去拿,所以就会报错,没有网络结构,PyObject_GetAttrString(pModule, "init"),他其实和import init from pModule一样,所以他就会报
# Can't get attribute 'Model' on <module '__main__' 
if __name__ == "__main__":
    init()
    model = Model()
    modelFF = torch.load("hminLoss.pkl")
    print("success_2")

解决办法就是,把整个网络参数以及结构全部保存

import numpy as np
import matplotlib.pyplot as plt
from IPython import display
from d2l import torch as d2l
import random
import numpy as np
import torch
import matplotlib.pyplot as plt
from IPython import display
from d2l import torch as d2

# 在保存模型时,将模型转化为脚本并保存,整个网络参数以及结构全部保存
model = torch.load('angelminLoss.pkl')
scripted_model = torch.jit.script(model)
torch.jit.save(scripted_model, 'angelminLoss_scripted.pkl')

读取模型

model = torch.jit.load('angelminLoss_scripted.pkl')

这样就可以正常读取了

四.参考

https://blog.51cto.com/wangjichuan/5691185(Qt调用Python详细过程)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第1章 初识JavaScript

学习目标 了解JavaScript基本概念&#xff0c;能够说出JavaScript的作用、由来、组成和特点 熟悉常见浏览器的特点&#xff0c;能够说出浏览器的组成以及作用 掌握下载和安装Visual Studio Code编辑器&#xff0c;能够独立完成编辑器的下载和安装 掌握JavaScript代码引入方式…

Windows电脑无法睡眠解决办法

原因 电脑无法休眠的原因&#xff0c;是打开离开模式策略后&#xff0c;windows内核会持续调用CPU资源&#xff0c;导致系统一直在运行而无法关闭。关闭后就好了。 解决步骤 修改注册表 操作步骤如下: 按winR&#xff0c;输入regedit&#xff0c;打开注册表编辑页面。输入如下…

第11章 GUI Page462~476 步骤二十三,二十四,二十五 Undo/Redo ③实现“Undo/Redo”菜单项

工程六 添加“编辑”菜单和子菜单 菜单ID分别为 idMenuEditUndo 和 idMenuEditRedo 热键&#xff08;快捷键&#xff09;分别为CtrlZ 和 CtrlShiftZ 变量名分别为 MenuItemEditUndo 和 MenuItemEditRedo 分别添加事件 ActionLink类增加成员函数 运行效果&#xff1a;“添加…

Docker安装WebRTC下TURN服务

详细实现方式以及代码下载请前往 https://www.passerma.com/article/90 实现效果 一、手动构建镜像 1.新建Dockerfile文件 文件用于编译镜像 以alpine为基础镜像 添加coturn需要的依赖库 获取coturn并进行编译 通过start.sh启动turnserver服务 Dockerfile FROM alpineRUN ap…

AI与5G、IDC等成为数字经济的重要基础设施

AI与5G、IDC等已经成为数字经济的重要基础设施&#xff0c;它们的影响和作用不容忽视。随着技术的迅速发展&#xff0c;AI在各行各业都得到了广泛应用&#xff0c;并成为数字经济的核心驱动力之一。 首先&#xff0c;AI的兴起为数字经济带来了巨大的机遇。AI技术可以帮助企业从…

Vue2商品规格选择

Vue2Element-ui Vu2仿写拼多多商家后台规则选择&#xff0c;为什么用Vue2呢&#xff0c;因为公司用的Vue2... 样式不是很好看&#xff0c;自己调一下就行。 <template><div ref"inputContainer"><div>{{ combinationsResult }}</div><…

案例099:基于微信小程序的外卖小程序的研究与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

在Gitee上维护Erpnext源

在Gitee上维护Erpnext源 官方的frappe和erpnext地址: GitHub - frappe/frappe: Low code web framework for real world applications, in Python and Javascript GitHub - frappe/erpnext: Free and Open Source Enterprise Resource Planning (ERP) 1, 仓库地址输入frappe的官…

R 批量对多个变量进行单因素方差分析 批量计算均值±标准差

多个变量批量进行单因素方差 R实现 文章目录 一、批量生成均值标准差 P值二、添加协变量单因素方差分析&#xff0c;生成校正P值三、在分层情况下进行单因素方差分析四、添加协变量和交互项的单因素方差分析&#xff0c;生成交互项的P值 一、批量生成均值标准差 P值 数据结构如…

pyfolio工具结合backtrader分析量化策略组合,附源码+问题分析

pyfolio可以分析backtrader的策略&#xff0c;并生成一系列好看的图表&#xff0c;但是由于pyfolio直接install的稳定版有缺陷&#xff0c;开发版也存在诸多问题&#xff0c;使用的依赖版本都偏低&#xff0c;试用了一下之后还是更推荐quantstats。 1、安装依赖 pip install …

【STM32】STM32学习笔记-TIM输出比较(15)

00. 目录 文章目录 00. 目录01. 输出比较简介02. PWM简介03. 输出比较通道(高级)04. 输出比较通道(通用)05. 输出比较模式06. PWM基本结构07. PWM参数计算08. 舵机简介09. 舵机硬件电路10. 直流电机及驱动简介11. 直流电机硬件电路12. 附录 01. 输出比较简介 OC&#xff08;Ou…

ASP.NET可视化流程设计器源码

源码介绍: ASP.NET可视化流程设计器源码已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角色的权限管理等系统开发必须功能&#xff0c;大大为您节省开发时间&#xff0c;是您开发OA.CRM、HR等企事业各种应用管理系统和工作流系统的最佳基…

Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis的慢查询 许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似…

【开源】基于JAVA语言的服装店库存管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

梦想家内容管理系统(Dreamer CMS)跨站请求伪造漏洞

梦想家内容管理系统&#xff08;Dreamer CMS&#xff09;跨站请求伪造漏洞 目标:GitHub - iteachyou-wjn/dreamer_cms: Dreamer CMS 梦想家内容发布系统采用流行的SpringBoot搭建&#xff0c;支持静态化、标签化建站。不需要专业的后台开发技能&#xff0c;会HTML就能建站&…

java数据结构与算法刷题-----LeetCode63. 不同路径 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

【GitHub】-design-pattern-extend(设计模式扩展)

写在前面 偶然间看到一篇文章 《Java 中保持扩展性的几种套路和实现》&#xff0c;写的不错&#xff0c;但是类图画的差了点儿意思。于是&#xff0c;自己动手画了画&#xff0c;对其中的内容作了一些调整&#xff0c;对包做了进一步划分&#xff0c;便于理解消化。以下是对Git…

C++ Qt开发:Charts与数据库组件联动

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍Charts组件与QSql数据库组件的常用方法及灵活…

【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

00. 目录 文章目录 00. 目录01. 定时器中断相关API1.1 TIM_InternalClockConfig1.2 TIM_TimeBaseInit1.3 TIM_TimeBaseInitTypeDef1.4 TIM_ClearFlag1.5 TIM_ITConfig1.6 TIM_Cmd1.7 中断服务函数1.8 TIM_ETRClockMode2Config 02. 定时器定时中断接线图03. 定时器定时中断示例0…