Qt 调用Python引擎混合编程

0、前言

使用Qt和Python做混合编程,充分发挥Qt GUI的图形化框架优势和Python数据处理的计算能力。复杂的计算可用到Python众多三方库,将Python需要执行的功能写成py文件,做成插件的形式,被Qt c++调用,修改py文件即可实现一套GUI框架多种内核算法的效果。本文使用Qt调用Python三方库做多高维数据MDS降维计算。

1、运行环境

以下测试在windows10主机测试成功。需要注意Qt的位数需要和Python的位数一致。

  • Qt 5.12.0 32bit,MinGW-32bit编译器。
  • Python 3.7.3 32bit

2、Python CAPI的使用文档

Python/C API Reference Manual — Python 3.10.0 documentation

3、Qt配置环境

将Python安装的文件夹复制以下内容到Qt工程中,此处是复制到release文件夹下,以便Qt生成的可执行程序能够在当前目录下找到Python。libs文件夹下有python3.dll,python37.dll,一起复制到release目录。

 项目文件.pro 添加Python依赖头文件和库,指定位置为刚刚复制的文件夹内。

4、Qt调用Python示例

 在需要引用Python的文件添加头文件引用,Python的slots和Qt的slots关键字冲突,所以按以下方式添加引用。

 编写初始化插件接口,只用调用一次。项目头文件中添加PyObject* py_module; PyObject* py_dic; PyObject* py_func;这些变量无需用Py_DECREF清理,Python内部自动清理(测试中发现一旦清理,再次运行就崩溃)。

由于需要打包发布应用程序,因此需要指定可执行文件寻找的Python主目录,通过以下代码实现

QString path = QCoreApplication::applicationDirPath() + "/python37_32";
Py_SetPythonHome((wchar_t*)(reinterpret_cast< const wchar_t* >(path.utf16())));

  若是多线程调用,则需要使用Python全局锁GIL,参考网上的资源,新建一个PyThreadStateLock类,在任何多线程调用Python的位置,先实例化一个PyThreadStateLock。

 

  

  编写接口调用Python插件计算,主要用到的CAPI如下所示,使用方法可以参考官方文档说明。

  • PyList_New
  • PyList_SetItem
  • PyList_GetItem 
  • Py_BuildValue
  • PyTuple_New
  • PyObject_CallObject 
  • PyObject_Size
  • PyArg_Parse

被调Python三方库的接口如下:

5、程序打包发布

Qt编译的应用程序按照windeployqt常规方式打包,需要注意的是要将release文件夹下的Python文件夹复制到打包后的目录下,同时复制python3.dll,python37.dll到可执行程序的根目录。

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

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

相关文章

高扫后督解决方案 力助银行内部核查

网络时代&#xff0c;传统扫描仪需求萎缩&#xff0c;但作为扫描仪家族中重要成员&#xff0c;高速扫描仪却正经历逆势繁荣&#xff1a;因随以金融、教育、政府为代表的行业信息化建设力度不断加强&#xff0c;海量文档快速扫描及数字化存储管理需求飞涨&#xff0c;而满足这类…

[react] 在react中遍历的方法有哪些?它们有什么区别呢?

[react] 在react中遍历的方法有哪些&#xff1f;它们有什么区别呢&#xff1f; 有React.Children.map和 React.Children.forEach这两个方法&#xff0c;他们的参数都是在组件中接受props.children这个ReactNode作为参数&#xff0c;然后进行遍历。专门提供这两个遍历方法的目的…

C# 特性 Attribute

特性就是在类的类名称、属性、方法等上面加一个标记&#xff0c;使这些类、属性、方法等具有某些统一的特征&#xff0c;从而达到某些特殊的需要。举个小栗子&#xff1a;方法的异常捕捉&#xff0c;你是否还在某些可能出现异常的地方&#xff08;例如数据库的操作、文件的操作…

setsockopt , getsoctopt 函数的Level 参数和 name 参数对应表!!!

From: http://blog.csdn.net/jasonm2008/article/details/4016292 int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen ); 对于这个函数的level级别的参数到底有哪些&#xff0c; optname &#xff0c;对应的又有哪些&#xff0c;一…

Qt 调用MATLAB引擎混合编程

0、前言 C/C调用MATLAB有三个方式&#xff1a;调用dll文件、调用exe可执行程序和调用Engin引擎。 第一种方式利用MATLAB Coder 将MATLAB代码生成C/C代码和相关动态链接库&#xff0c;可以在没有MATLAB的电脑和设备上运行。 第二种方式利用MATLAB将MATLAB代码编译成exe可执行…

caja 原理 : 前端

作为前端开放的基础安全保证&#xff0c;caja 是目前比较合适的运行机制&#xff0c;包括前端运行环境以及后端编译环境&#xff0c;这次先整体介绍下 caja 在前端是如何屏蔽外部模块代码对整体应用的影响 &#xff08;注意&#xff1a;官方文档较少&#xff0c;以下为自己理解…

[react] 请说说什么是useImperativeHandle?

[react] 请说说什么是useImperativeHandle&#xff1f; // useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值。 // useImperativeHandle 应当与 forwardRef 一起使用&#xff1a;import React, { useImperativeHandle, forwardRef } from react import {…

xcode3.2.6升级至4.0.2经验加教训总结(转)

首先&#xff0c;完美运行都项目直接在Xcode4.0.2中build可能会出现这样一个错误&#xff08;人品好的自觉绕道&#xff09;&#xff1a;[BEROR]No architectures to compile for (ARCHSi386, VALID_ARCHS). 首先第一反应是打开工程的Build Settings&#xff0c;最基本的检测&a…

扩展欧几里德问题

我们先来看这个问题 求最大公约数的gcd(m,n)方法也可以如下定义&#xff1a; 如果m%n为0&#xff0c;那么gcd(m,n)的值为n. 否则&#xff0c;gcd(m,n)就是gcd(n,m%n) 编写一个递归的方法来求最大公约数。编写一个测试程序&#xff0c;计算gcd(24,16)和gcd(255,5) 我们先引入欧几…

步步为营:Asp.Net序列化Json格式的两种方法

过去我们使用JSON.net序列化一个对象&#xff0c;在asp.net3.5中已经集成了序列化对象为json的方法。 我们分别针对System.Runtime.Serialization.Json和System.Web.Script.Serialization两个命名空间下的不同方法进行序列化和反序列化。 System.Runtime.Serialization.Json (在…

[react] react中setState的第二个参数作用是什么呢?

[react] react中setState的第二个参数作用是什么呢&#xff1f; 第二个参数是一个callback函数&#xff0c;用于setState设置state的属性值成功之后的回调&#xff0c;此时调用this.state.property可以取到刚刚设置的最新的值 个人简介 我是歌谣&#xff0c;欢迎和大家一起…

Qt 调用VISA库通过SCPI程控仪器-以IT8906A电子负载为例

SCPI是一种可编程仪器的标准命令&#xff0c;可通过 GPIB&#xff0c; RS232&#xff0c; USB&#xff0c; LAN接口等控制仪器功能的编程语言。 SCPI 置于 IEEE 488.2 硬件部分的顶层。相同 SCPI 命令和参数控制着不同机器的相同功能。一般标准仪器都支持SCPI协议&#xff0c;如…

TCP控制字段标志:URG、ACK、PSH、RST、SYN、FIN

From: http://blog.csdn.net/wangfeng2500/article/details/7650062 在TCP层&#xff0c;有个FLAGS字段&#xff0c;这个字段有以下几个标识&#xff1a;SYN, FIN, ACK, PSH, RST, URG. 其中&#xff0c;对于我们日常的分析有用的就是前面的五个字段。 它们的含义是&#x…

Ubuntu 14.04 ThinkPad E431无线网卡驱动安装

Ubuntu 14.04下安装无线网卡驱动。 sudo apt-get install linux-headers-generic build-essential dkms sudo apt-get install linux-source sudo apt-get install --reinstall bcmwl-kernel-source sudo modprobe wl转载于:https://www.cnblogs.com/shoemaker/p/4800772.ht…

关于如何使用的MSCS(微软群集服务器)中的iSCSI Guest Initiators (客户机启动器)...

发布者&#xff1a;Dell-Terry Z 作者&#xff1a;戴尔公司 William U 嗨&#xff0c;大家好&#xff01;过去的几周实在太激动人心了。第一届戴尔全球存储论坛&#xff08;Dell Storage Forum&#xff09;刚刚结束&#xff0c;我有一大堆的东西想跟大家分享&#xff0c;我想…

openssl版本信息和支持的命令

1、查看openssl版本 openssl version -a openssl version 可以看到版本信息和安装位置: 2、查看openssl支持的命令 openssl help Standard commands asn1parse ca ciphers cms crl crl2pkcs7 dgst …

[react] react中的setState是同步还是异步的呢?为什么state并不一定会同步更新?

[react] react中的setState是同步还是异步的呢&#xff1f;为什么state并不一定会同步更新&#xff1f; 由React控制的事件处理程序&#xff0c;以及生命周期函数调用setState不会同步更新state 。 React控制之外的事件中调用setState是同步更新的。比如原生js绑定的事件&…

还是FreeBSD

原文2005年4月13日写在MSN SPACE上 前几天做的FreeBSD服务器在使用过程中&#xff0c;流量大时会自动断线&#xff0c;提示如下一段话&#xff1a; no memory for rx buffer 一直找不出原因。今天把网卡换了&#xff0c;看明天是否还有错。转载于:https://blog.51cto.com/isgod…

python语法笔记(五)

1、python内存管理 &#xff08;1&#xff09;对象内存使用 &nsbp;&nsbp;&nsbp;&nsbp;在python中通过执行内建函数 id(obj) 可以获得对象obj在内存中的地址。在python中&#xff0c;整数和短小的字符&#xff0c;python都会缓存这些对象&#xff0c;以便重复使…

python实现手机号归属地相关信息查询

根据指定的手机号码&#xff0c;查询其归属地等相关信息&#xff0c;python实现&#xff1a; 手机号文件&#xff1a;test.txt 13693252552 13296629989 13640810839 15755106631 15119622732 13904446048 18874791953 13695658500 13695658547 15950179080 15573462779 15217…