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

文章目录

  • 创建项目
  • 配置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.mfbz.cn/a/30537.html

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

相关文章

【C++】vector的模拟实现

目录 1.vector的结构2.构造函数2.1 无参构造2.2 以迭代器区间作为参数的构造函数2.3 构造n个value值 3.拷贝构造3.1 传统写法3.2 现代写法 4.赋值重载5.迭代器失效问题5.1 reserve和resize5.2 insert 5.3 erase4. 整体代码&#xff08;包含迭代器、析构函数等&#xff09; 1.ve…

springboot实验室管理系统-计算机毕设 附源码86757

springboot实验室管理系统 摘 要 验室管理系统是将实验室的分析仪器通过计算机网络连起来&#xff0c;采用科学的管理思想和先进的数据库技术&#xff0c;实现以实验室为核心的整体环境的全方位管理。它集用户管理&#xff0c;实验室信息管理&#xff0c;实验室预约管理&#x…

Java设计模式——策略模式

1. 策略模式简介 策略模式: 策略模式是一种行为型模式, 它将对象和行为分开, 将行为定义为一个行为接口和具体行为的实现 策略模式最大的特点是行为的变化, 行为之间可以相互替换 每个if判断都可以理解为一个策略. 本模式是的算法可独立于使用它的用户而变化 2. 模式结构 策略…

Flink 学习七 Flink 状态(flink state)

Flink 学习七 Flink 状态(flink state) 1.状态简介 流式计算逻辑中,比如sum,max; 需要记录和后面计算使用到一些历史的累计数据, 状态就是:用户在程序逻辑中用于记录信息的变量 在Flink 中 ,状态state 不仅仅是要记录状态;在程序运行中如果失败,是需要重新恢复,所以这个状态…

Java实训第七天——2023.6.13

文章目录 一、用Visual Studio Code写一个计算器二、同一个js被多个html引用三、js操作css四、DOM对象属性的操作案例五、js解析json 一、用Visual Studio Code写一个计算器 功能&#xff1a;实现简单的加减乘除 <!DOCTYPE html> <html lang"en"> <…

LeetCode 2481. 分割圆的最少切割次数

【LetMeFly】2481.分割圆的最少切割次数 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-cuts-to-divide-a-circle/ 圆内一个 有效切割 &#xff0c;符合以下二者之一&#xff1a; 该切割是两个端点在圆上的线段&#xff0c;且该线段经过圆心。该切割是一端…

mapbox-gl 点位编辑功能

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

kettle开发-Day38-超好用自定义数据处理组件

目录 前言&#xff1a; 一、半斤八两&#xff0c;都不太行 1、表输入&#xff0c;速度快&#xff0c;但不稳妥 2、稳的一批&#xff0c;但是慢的像蜗牛 二、各诉衷肠&#xff0c;合作共赢 1、表输入&#xff0c;高效数据插入 2、插入更新&#xff0c;一个都不能少 三、表输…

express的使用(四) nodejs转发表单到后台

原文链接 搬砖的林小白-express的使用(四) 个人博客地址&#xff0c;求关注&#xff0c;也希望大家在里面批评我的不足之处 看前提示 本篇所讲述的内容是node端转发前端发送过来的表单到第三方中&#xff0c;应用的场景有很多&#xff0c;如我们经常做的将文件存储到七牛云或…

Scala学习笔记

累了&#xff0c;基础配置不想写了&#xff0c;直接抄了→Scala的环境搭建 这里需要注意的是&#xff0c;创建新项目时&#xff0c;不要用默认的Class类&#xff0c;用Object&#xff0c;原因看→scala中的object为什么可以直接运行 一、Scala简介 1.1 图解Scala和Java的关系 1…

大数据测试基本知识

常用大数据框架结构 1.大数据测试常用到的软件工具 工具推荐&#xff0c;对于测试数据构造工具有&#xff1a;Datafaker、DbSchema、Online test data generator等&#xff1b;ETL测试工具有&#xff1a;RightData、QuerySurge等&#xff1b;数据质量检查工具&#xff1a;great…

MySQL-SQL存储过程/触发器详解(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

Three.js--》实现3d地月模型展示

目录 项目搭建 初始化three.js基础代码 创建月球模型 添加地球模型 添加模型标签 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还…

《离散数学》:代数系统和图论导论

一、代数系统 代数系统是数学中的一个重要概念&#xff0c;它涉及一组对象以及定义在这些对象上的运算规则。代数系统可以是抽象的&#xff0c;也可以是具体的。 在抽象代数中&#xff0c;代数系统通常由一组元素和一组操作&#xff08;或称为运算&#xff09;组成。这些操作…

【MySQL新手入门系列四】:手把手教你MySQL数据查询由入门到学徒

SQL语言是与数据库交互的机制&#xff0c;是关系型数据库的标准语言。SQL语言可以用于创建、修改和查询关系数据库。SQL的SELECT语句是最重要的命令之一&#xff0c;用于从指定表中查询数据。在此博客中&#xff0c;我们将进一步了解SELECT语句以及WHERE子句以及它们的重要性。…

vue进阶-vue-route

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。 本章只做学习记录&#xff0c;详尽的内容一定要去官网查看api文档 Vue Router-Vue.js 的官方路由 1. 路由的基本使用 1.1 安装vue-router npm install vue-…

SpringCloud Eureka注册中心高可用集群配置(八)

当注册中心扛不住高并发的时候&#xff0c;这时候 要用集群来扛&#xff1b; 我们再新建两个module microservice-eureka-server-2002 microservice-eureka-server-2003 第一步&#xff1a; pom.xml 把依赖加下&#xff1a; <dependencies> <dependency…

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…

Prompt 范式产业实践分享!基于飞桨 UIE-X 和 Intel OpenVINO 实现跨模态文档信息抽取

近期 Prompt 范式备受关注&#xff0c;实际上&#xff0c;其思想在产业界已经有了一些成功的应用案例。中科院软件所和百度共同提出了大一统诸多任务的通用信息抽取技术 UIE&#xff08;Universal Information Extraction&#xff09;。截至目前&#xff0c;UIE 系列模型已发布…

Selenium 相对定位

目录 前言&#xff1a; 相对定位 工作原理 可用的相对定位 Above Below Left of Right of Near 链式相对定位 相对于WebElement的相对定位 实例演示 前言&#xff1a; Selenium传统定位基本能解决80%的定位需求&#xff0c;但是还是有一些复杂场景传统定位定不到的…