QT调用python文件

基本步骤

1.将python文件要是使用的环境添加到环境变量中

2.新建一个QT项目

3.在.pro文件中加入需要的python库文件目录

右击项目名,然后单击“添加库”,库类型选择为“外部库”,库文件选择python要使用的环境中的“python38.lib”





此时,在.pro文件中新增了如下语句。

最后,还需要在.pro文件中添加下面语句。

此时,.pro文件就配置好了,该项目中可以之间调用"python.h"库文件了。

4.在QT项目中,新建一个python文件

右击项目名,选择”Add new…“,然后选择python文件,新建一个“Python File”



此时,在项目目录下,新建了“Other files”文件夹,同时文件夹中保存有刚刚新建的.py文件。

最后,就可以在.py文件中写入自己想要实现的功能(可以直接在该文件中写,但是没有联想,不方便;也可以直接在其他地方写完后复制到该文件中)

注:在QT中调用python是以函数的形式调用,因此.py文件中的功能写成函数的形式

5.在main.cpp中进行python的调用

首先在main.cpp中调用“python.h”,即#include "python.h"

然后在主函数中初始化、配置python,并调用.py文件中的某个函数,代码如下。

#include "mainwindow.h"
#include <QApplication>
#include "Python.h"
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);Py_SetPythonHome((const wchar_t *)(L"D:/anaconda3/envs/pycharm"));Py_Initialize();if ( !Py_IsInitialized() ){return -1;}PyRun_SimpleString("import sys");//设置py脚本的路径PyRun_SimpleString("sys.path.append('./')");//当前路径PyObject* pModule = PyImport_ImportModule("temp");  // 这里的temp就是创建的python文件if (!pModule) {qDebug()<< "Cant open python file!\n" << endl;return -1;}PyObject* pFunhello= PyObject_GetAttrString(pModule,"Hello");  // 这里的hellow就是python文件定义的函数if(!pFunhello){qDebug()<<"Get function hello failed"<<endl;return -1;}PyObject_CallFunction(pFunhello,NULL);Py_Finalize();return a.exec();
}

此时就实现了QT调用python的功能。

遇到的问题

1.无法调用“python.h”,则检查.pro配置文件是否添加了正确的库;同时,检查环境变量是否配置正确。

注:在新添加环境变量后,需要重启QT。

2.调用“python.h”后,可能出现如下问题

问题出现的原因是在“object.h”中

解决办法:

PyType_Slot *slots; /* terminated by slot==0. */替换为

#undef slots
PyType_Slot *slots; /* terminated by slot==0. */
#define slots Q_SLOTS

如下图所示

3.若运行时输出“Cant open python file!”,则可能出现两个问题;一,检查.py文件是否和运行的.exe文件在同一目录下;即,将.py文件复制到debug或release文件夹中;二,检查.py文件是否出现语法性错误

python传参的实现

在QT文件中给python传入参数或读取python传出的参数,都是以PyObject的数据类型进行传入和传出的。

1.给python传入参数

首先在python中写入需要传参的函数,例如两个数相加。

然后在main.cpp中给python函数传递参数,代码如下。

#include "mainwindow.h"
#include <QApplication>
#include "Python.h"
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);Py_SetPythonHome((const wchar_t *)(L"D:/anaconda3/envs/pycharm"));Py_Initialize();if ( !Py_IsInitialized() ){return -1;}PyRun_SimpleString("import sys");//设置py脚本的路径PyRun_SimpleString("sys.path.append('./')");//当前路径PyObject* pModule = PyImport_ImportModule("temp");  // 这里的temp就是创建的python文件if (!pModule) {qDebug()<< "Cant open python file!\n" << endl;return -1;}PyObject* pFunhello= PyObject_GetAttrString(pModule,"Hello");  // 这里的hellow就是python文件定义的函数if(!pFunhello){qDebug()<<"Get function hello failed"<<endl;return -1;}PyObject* pFunSum = PyObject_GetAttrString(pModule, "Sum");if(!pFunSum){qDebug()<<"Get function Sum failed"<<endl;return -1;}PyObject_CallFunction(pFunhello,NULL);//  新建一个变量,长度为传入参数个数,然后一次将数据传入PyObject* args = PyTuple_New(2);int x = 100;int y = 2;PyTuple_SetItem(args, 0, Py_BuildValue("i", x));PyTuple_SetItem(args, 1, Py_BuildValue("i", y));PyEval_CallObject(pFunSum, args);Py_Finalize();return a.exec();
}

2.读取python传出的参数

例如,在.py文件中某函数实现输入两个数字,输出加、减的结果

#include "mainwindow.h"
#include <QApplication>
#include "Python.h"
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);Py_SetPythonHome((const wchar_t *)(L"D:/anaconda3/envs/pycharm"));Py_Initialize();if ( !Py_IsInitialized() ){return -1;}PyRun_SimpleString("import sys");//设置py脚本的路径PyRun_SimpleString("sys.path.append('./')");//当前路径PyObject* pModule = PyImport_ImportModule("temp");  // 这里的temp就是创建的python文件if (!pModule) {qDebug()<< "Cant open python file!\n" << endl;return -1;}PyObject* pFunhello= PyObject_GetAttrString(pModule,"Hello");  // 这里的hellow就是python文件定义的函数if(!pFunhello){qDebug()<<"Get function hello failed"<<endl;return -1;}PyObject* pFunSum = PyObject_GetAttrString(pModule, "Sum");if(!pFunSum){qDebug()<<"Get function Sum failed"<<endl;return -1;}PyObject* pFunSum_Minus = PyObject_GetAttrString(pModule, "Sum_Minus");if(!pFunSum_Minus){qDebug()<<"Get function Sum_Minus failed"<<endl;return -1;}PyObject_CallFunction(pFunhello,NULL);//  新建一个变量,长度为传入参数个数,然后一次将数据传入PyObject* args = PyTuple_New(2);int x = 100;int y = 2;PyTuple_SetItem(args, 0, Py_BuildValue("i", x));PyTuple_SetItem(args, 1, Py_BuildValue("i", y));PyEval_CallObject(pFunSum, args);PyObject* res = PyEval_CallObject(pFunSum_Minus, args);int sum, minus;if(res) {sum = PyLong_AsLong(PyTuple_GetItem(res, 0));minus = PyLong_AsLong(PyTuple_GetItem(res, 1));}qDebug() << sum << minus;Py_Finalize();return a.exec();
}

QT调用python文件相关推荐

  1. linux python qt 安装目录,Linux 下QT调用Python库文件 以及Linux 安装Python3.8开发环境 问题...

    最近想运用linux系统下Qt来实现c++ 与python的混合编程,linux系统会自带python2.7版本或者python3.5版本(深度linux). Qt调用python文件需要在pro文件 ...

  2. Qt 调用Python引擎混合编程

    0.前言 使用Qt和Python做混合编程,充分发挥Qt GUI的图形化框架优势和Python数据处理的计算能力.复杂的计算可用到Python众多三方库,将Python需要执行的功能写成py文件,做成 ...

  3. php python-浅谈php调用python文件

    关于PHP调用Python数据传输问题 这是以前大学时做项目出现的问题,现在把它挪上来,希望给遇到问题的未来大佬给出一些小的思路,请大佬们不要大意的帮我改正,如果出现问题或者有更好的解决方法,希望大家 ...

  4. c++Error:c++调用python文件提示由于找不到python3.8.dll,无法继续运行。。。

    [写在前面] 今天在做C++调用python文件时发程序运行报错提示: "由于找不到python3.8.dll,无法继续运行..." [原因描述] 系统中缺少python3.8.d ...

  5. java调用第三方dll文件 源码_C++调用python文件(包含第三方库)

    本文内容主要参考以下两篇文章: 武军:C++中调用python(VS2017)​zhuanlan.zhihu.com C++调用python的那些坑(详细教程步骤)_giser_xupf的博客-CSD ...

  6. C#调用python文件

    最近在工作中需要(呵呵)用C#调用python文件,所使用的工具是IronPython 由于对C#语言不熟悉,所以这篇文章里就不探讨C#语言相关问题. 准备工作 下载安装IronPython,地址:h ...

  7. MATLAB调用python文件以及调用.exe文件方法

    引言: 在编程的时候有这么一个需求,就是要用MATLAB去调用python文件以及调用python写好的功能函数. 配置环境: MATLAB 2017b: python 2.7x: 方法: 1.查看m ...

  8. Java:在Java中调用python文件执行

    目录 一.Java内置Jpython库(不推荐) 1.1 下载与使用 1.2 缺陷 二.使用Runtime.getRuntime()执行脚本⽂件 2.1 使用 2.2 缺陷 三.利用cmd调用pyth ...

  9. C++调用Python文件,TensorFlow和PyTorch构建的深度学习模型,无法使用GPU的情况分析。

    C++调用Python深度学习模型,包含TensorFlow和PyTorch等构造的模型,然后使用GPU出现问题.包含C++调用Python函数,C++加载模型到GPU,GPU内存占用过大,计算完毕内 ...

最新文章

  1. 空洞卷积(Dilated Convolution):有之以为利,无之以为用
  2. centos升级glibc动态库
  3. 免费阿里云服务器超爽体验(为阿里做个广告吧)
  4. 期末数据结构复习的一点笔记
  5. springsecurity实现记住我的功能,将用户的登录信息保存到本地浏览器,即使关闭浏览器也不用登录
  6. c51语言跑马灯程序,基于C51单片机的跑马灯程序设计
  7. YDOOK:ANSYS 谐波分析的要点和主要应用场景 谐波效应的来源
  8. iOS MOV转MP4
  9. 功率谱估值方法matlab仿真——2、经典估值方法介绍
  10. 《我在大学挺好的》之——选择了计算机专业
  11. 7个最佳小型企业电子邮件营销服务(2020)
  12. 修真院教学模式四大体系之学习方法篇
  13. (实战)[自动驾驶赛车-中国联赛]-合集
  14. 认知神经科学背景综述
  15. linux内核配置cpu相关,Linux内核配置
  16. 商务签证之结局:面试
  17. 推荐学java——Spring之AOP
  18. 进程间通信:命名管道FIFO(2)
  19. 火车售票系统/C语言
  20. etiger.vip 293.野兽出没

热门文章

  1. c语言定于字符串string,c语言字符串string
  2. Android studio端口占用5037解决方法
  3. python url解码_对python中url参数编码与解码的实例详解
  4. 实现诺易腾与unity3D实时交互的软件设置
  5. mapState使用方法
  6. P3073 [USACO13FEB]Tractor S
  7. (转)《统一价值论》
  8. 天池新人实战赛o2o优惠券使用预测四(别家代码分析1)
  9. 记录一段js代码匹配JSON的值
  10. geant4安装教程