c++Qt Creator调用 python 完整版 + 解决bug过程

news2024/10/1 5:25:37

文章目录

  • 创建项目
  • 配置python环境
  • 导入Python库
  • 其他坑点
    • Python.h 头文件报错
    • ModuleNotFoundError: No module named 'encodings’ 完美解决
    • 找不到python文件
  • 成功!

文章首发于我的个人博客:欢迎大佬们来逛逛

创建项目

选择创建 qmake 项目:
在这里插入图片描述

选择创建 MSVC 64bit 版本:(选择Mingw可能会出错)

在这里插入图片描述

首先我们先创建一个普通的python文件

在这里插入图片描述
在这里插入图片描述

💡 注意文件名不要是 test.py,因为python中存在一个此文件,会产生冲突

输入以下内容用于测试python及常用库的导入

import numpy as np
import pandas as pd

def hello():
    print("hello")

配置python环境

选择**工具 - 外部 - 配置**

在这里插入图片描述

选择**外部工具** 点击**添加**添加工具

 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3ee901c5e7ca49a4912f4deb523b1834.png)

我们需要依次设置这三个参数

  1. 执行档:你的python.exe的路径,我使用的是anaconda3的python,因此我的路径是:F:\Tools\Ana\python.exe
  2. 参数:直接复制粘贴:%{CurrentDocument:FilePath}
  3. 工作目录:直接复制粘贴:%{CurrentDocument:Path}

在这里插入图片描述

输入完成后,点击应用 然后确定

可以给你的环境改个名字:我的是 python3.10版本.

在这里插入图片描述

切换到你的python文件中,测试是否正确:

选择**工具 - 外部 - python310**

在这里插入图片描述

运行如下:说明配置python环境成功,也就是说你以后写的python代码就可以在这个地方直接运行了。

在这里插入图片描述


导入Python库

我们想要真正的在Qt中调用Python,就必须要一个头文件:<Python.h>

这里面包含了很多Python与C互通的接口。

但是如果我们直接输入:#include <Python.h> 会报错,根本就找不到!!

我们需要导入。

检查以下我们刚才配置环境时,与**Python.exe 同级**目录下的 include 文件夹下有没有 **Python.h**文件,如果有就说明可以实现。

如果没有这个文件,你最好重新选择一个Python.exe,重新实现配置Python环境这一节,因为即使你配置好了环境,但是因为没有这个头文件也无法使用。

在这里插入图片描述

如果有,则我们开始导入:

右键项目名称:选择**添加库**。

选择添加库

在这里插入图片描述

在这里插入图片描述

注意这个地方非常重要!!!

我们要填写两个参数:

  1. 库文件:就是你的 **libs** 文件夹位置的python310.lib,我的位于:F:\Tools\Ana\libs\python310.lib
  2. 包含路径:就是刚才介绍的include的文件夹位置,我的位于:F:\Tools\Ana\include
  3. 注意其他的地方选择要和我的一样。

在这里插入图片描述

点击下一步,完成,接着你就会跳转到 .pro 文件中:

并且添加了如下的内容

其中就包含了我们所需要的 libs 和 include 等配置信息,我们直接保存即可。

在这里插入图片描述

其他坑点

Python.h 头文件报错

到这时我们就已经配置完成了,我们现在可以使用 Python.h 了,但是你会发现报一个错误,这是因为Qt的slots 和 python.h这个文件中的这个变量冲突了。

我们执行以下操作:

找到 object.h 文件:

在这里插入图片描述

并且在这个位置修改如下:即添加一个 #undef 和#define 即可。

在这里插入图片描述

使用管理员模式保存,这个错误就解决了。


ModuleNotFoundError: No module named 'encodings’ 完美解决

之后我们可以测试以下,输入以下代码:

获取Python文件中的这个函数模块,然后再调用:

#include <QCoreApplication>
#include <Python.h>
#include <iostream>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

		//初始化
    Py_Initialize();

    PyObject* module=PyImport_ImportModule("testPython");
    if (!module){
        qInfo()<<"Python file cant open!";
        return -1;
    }
    PyObject* pFunc=PyObject_GetAttrString(module,"hello");
    if (!pFunc){
        qInfo()<<"the Python function cant load!";
        return -1;
    }
		//调用函数
    PyObject_CallFunction(pFunc,NULL);

    Py_Finalize();
    return a.exec();
}

但是,之后你就会发现一个惊人的错误:

在这里插入图片描述

这是怎么回事,但是我在 anaconda3 中的Python中运行(因为我使用就是这个python)是存在这个模块的:

在这里插入图片描述

这并不是你的问题,解决如下:

PYTHONHOME 环境变量是用于指定Python 安装路径的,而 PYTHONPATH 环境变量是用于指定Python 模块搜索路径的

  1. 首先我们需要规定python的**home** ,即使用这样一个函数:注意这里的python安装路径是这样的:F:\Tools\Ana
//添加搜索python安装路径
Py_SetPythonHome(L"F:\\Tools\\Ana");

在这里插入图片描述

在这里插入图片描述

之后我们就解决了!!!但是这样做是不兼容的,因为我们如果要将项目打包发给别人,**别人可没有这个路径!!!**因此这个路径只能有你自己拥有,换句话说如果我们不写这一条语句就好了!!!改用环境变量!!

  1. 添加系统环境变量PYTHONHOME=F:\Tools\Ana

在这里插入图片描述

之后你把上面这条语句直接删除即可,注意:添加环境变量可能需要重启电脑生效,请耐心等待!

看到了吗,我们已经删除了并且不会出现这个报错了
在这里插入图片描述


找不到python文件

但是我们又出现了一个新的错误,即加载python时找不到这个文件,注意我的 testPython 是python文件名,不要加 .py后缀

这个问题是由于你的 qt生成的 .exe 程序找不到这个python文件,把他们放到同一目录下即可:
在这里插入图片描述

在这里插入图片描述

如何找到这个路径不用我多说了吧!!


成功!

在这里插入图片描述

在这里插入图片描述


参考链接:

Qt C++ Python 混合编程测试文档

Qt Creator中调用Python的常见问题_python path configuration: pythonhome = (not set) _妥善的博客-CSDN博客

解决QT C++调用python显示错误ModuleNotFoundError: No module named ‘encodings‘)及打包发布问题_modulenotfounderror: no module named 'encodings_代码行者的博客-CSDN博客

Qtcreator中C++调用python方法_👎 error: lnk1146: 没有用选项“/libpath:”指定的参数_alxe_made的博客-CSDN博客

python嵌入错误‘No module named site’的解决方案_no module named site pythonpath_游蓝海的博客-CSDN博客

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

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

相关文章

SciencePub学术 | 计算机类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 计算机类重点SCIE&EI征稿中&#xff01;影响因子高&#xff0c;对国人友好&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 计算机类重点SCIE&EI 【期刊简介】IF&#xff1a;8.0-8.5&#xff0c;JCR1区&am…

【新星计划回顾】第七篇学习-正则表达式-邮箱解释

&#x1f3c6;&#x1f3c6;时间过的真快&#xff0c;这是导师回顾新星计划学习的第七篇文章&#xff01; 在学习过程中&#xff0c;学员们也咨询了很多问题&#xff0c;我把一些问题整理以文章形式总结分享下。 最近这段时间非常忙&#xff0c;虽然导师首次参与新星计划活动已…

(八)矢量数据的空间分析——叠置分析②

矢量数据的空间分析——叠置分析② 目录 矢量数据的空间分析——叠置分析② 1.交集取反1.1图解1.2用法1.3操作步骤 2.图层联合2.1图解2.2用法2.3操作步骤 3.修正更新3.1图解3.2用法3.3操作步骤 1.交集取反 输入要素和更新要素中不叠置的要素或要素的各部分将被写入到输出要素类…

Android——基本控件(下)(十四)

1. 滚动视图&#xff1a;ScrollView 1.1 知识点 &#xff08;1&#xff09;掌握滚动视图的主要作用&#xff1b; &#xff08;2&#xff09;可以使用滚视图进行布局&#xff1b; 1.2 具体内容 范例&#xff1a; <ScrollView xmlns:android"http://schemas.android…

执行Windows数据恢复的有效指南!

​被删除的文件真的没有了吗&#xff1f; 在Windows上&#xff0c;删除的文件会被放在哪里&#xff1f;发生的事情告诉我们&#xff0c;这些最近和永久删除的文件可能在数据覆盖之前仍存在于你的Windows电脑上。 在删除之后&#xff0c;回收站会自动保留这些最近删…

【Mysql索引数据结构与算法】

脑图链接 一、索引 什么是索引 索引指的是数据库管理系统中一个排序的数据结构&#xff0c;以协助快速查询、更新数据库表中的数据。类似于书籍的目录&#xff0c;用于快速定位到所需内容、数据的页码位置。 优点&#xff1a;提高数据检索的效率&#xff0c;降低数据库的IO成…

TC8:UDP_FIELDS_06-10

UDP_FIELDS_06: Fields - Total Length 目的 验证DUT发送的UDP报文的Total Length字段的正确性 测试步骤 Tester:让DUT发送UDP消息,数据大小为udpUserDataSizeTester:监听在DIface-0上DUT:发送消息Tester:验证接收到的UDP消息的Total Length字段的值为udpUserDataSize+8期…

Ansys Zemax | 内窥镜物镜系统初始结构的优化提升(上)

概述 本文分为内窥镜系统简介、主要结构、系统分析、性能提升和总结五个部分&#xff0c;介绍了内窥镜系统的主要结构&#xff0c;并讨论了如何在 OpticStudio 中根据内窥镜物镜系统的初始结构进行像差分析&#xff0c;以及如何对其进行后续的优化提升。(联系我们获取文章附件…

【设计模式】SpringBoot优雅使用策略模式

文章目录 1.概述1.1.简述策略模式 2.实现方法2.1.实现思路2.2.实现代码2.3.策略拓展2.4.执行调用 3.总结 1.概述 本篇文章主要会描述SpringBoot与策略模式的结合使用&#xff0c;因为不涉及到理论部分&#xff0c;所以在阅读本篇之前&#xff0c;需要对策略模式的理论已经有了…

<C++> C++11 新的类功能

C11 新的类功能 1.默认成员函数 原来C类中&#xff0c;有6个默认成员函数&#xff1a; 构造函数析构函数拷贝构造函数拷贝赋值重载取地址重载const取地址重载 最后重要的是前4个&#xff0c;后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。 C11 新增了两…

大家知道什么是CDN吗?对网站有什么帮助?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是CDN&#xf…

【Python 随练】自由落体运动

题目&#xff1a; 一球从 100 米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下&#xff0c;求它在第 10 次落地时&#xff0c;共经过多少米&#xff1f;第 10 次反弹多高&#xff1f; 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个物…

华为OD机试之阿里巴巴找黄金宝箱(IV)(Java源码)

阿里巴巴找黄金宝箱(IV) 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c;每个箱子上面有一个数字&#xff0c;箱子排列成一个环&#xff0c;编号最大的箱子的下一个是编号为0的箱子。…

[进阶]网络通信:概述、IP地址、InetAddress

什么是网络编程&#xff1f; 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09;。 Java提供的网络编程解决方案就是在java.net.*包下进行网络编程。 基本的通信架构 基本的通信架构有2种形式&#xff1a;CS架构&#xff08;Cl…

C++IO流和类型处理(11)

IO流 IO流包括 标准IO流&#xff0c;字符串流&#xff0c;文件流 标准IO流 基础使用 #include <iostream> //包括istream和ostream cin >> ----- 标准输入 cout<< ----- 标准输出 clog<< ----- 带缓冲区的标准错误 cerr<< ----- 不带缓冲…

lazada、速卖通、煤炉、eBay 、亚马逊测评环境系统:如何掌握核心养号技巧?

作为一个准备跨足测评行业的业者&#xff0c;或是一个正在考虑将电商业务转向测评服务的卖家&#xff0c;一份详尽的养号指南绝对是你不可错过的知识宝库。 跨境电商平台无疑是巨大的数据中心&#xff0c;它们不仅检测你的设备参数和IP&#xff0c;还分析你的购物习惯&#xf…

mapbox-gl 点位编辑功能

文章目录 前言方式一&#xff1a;借助 Marker添加自定义icon添加POI图层&#xff0c;绑定对应事件基于Marker交互创建自定义Marker编辑 / 创建POI 方式二&#xff1a;采用 mapbox-gl-draw 插件总结 前言 矢量在线编辑是gis常用的编辑功能&#xff0c;兴趣点&#xff08;POI&am…

力扣算法练习(一)

目录 1. 两数相加&#xff08;2&#xff09; 2. 寻找两个正序数组的中位数&#xff08;4&#xff09; 1. 两数相加&#xff08;2&#xff09; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储…

MySQL 中的常用函数详解

0️⃣前言 MySQL是一种常用的关系型数据库管理系统&#xff0c;它提供了许多内置函数来处理数据。本文将介绍MySQL中的各种常用函数&#xff0c;包括字符串函数、日期函数、数学函数、聚合函数等。 文章目录 0️⃣前言1️⃣字符串函数1.1CONCAT函数1.2SUBSTRING函数1.3REPLACE函…

高级SQL语句1

高级SQL语句 建立实验环境高级语句1.---- SELECT ----显示表格中一个或数个字段的所有数据记录2.---- DISTINCT ----不显示重复的数据记录3.---- WHERE ----有条件查询4.---- AND OR ----且 或 &#xff08;一般配合where使用&#xff09;5.---- IN ----显示已知的值的数据记录…