qt调用python脚本详细

本文详细介绍了如何在Windows 10环境下,使用Python 3.8(64位)和QT 5.12.10(64位)进行集成开发。关键步骤包括确保位数匹配、配置QT项目、导入Python库、修改源代码以设置Python环境及调用Python函数。特别强调了Py_SetPythonHome函数的重要性,以确保能够正确访问Python安装的库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先要确保qt和python位数匹配,本人因为位数不同多花了一天的时间查问题结果发现是位数不同。

环境:win10  python3.8(64位)  qt5.12.10(64位

1. 新建一个QT项目

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

打开.pro文件,右键选择添加库→外部库→浏览库文件→选择python38.lib

 

 注意红色方框位置不要选错

 

将导入的语句的最后一行删掉

3. 修改object.h文件

 我的路径是 D:\ThePaK\Python3.8\include

添加红框中的代码

执行新创建的QT项目,生成debug文件,将要执行的python脚本放在debug文件夹中

 

Py_Module.py

def prin():
    return "hello"
def add(a,b):
    return a+b

 mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "D:\ThePaK\Python3.8\include\Python.h"

#include<iostream>
#include<QDebug>

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Py_SetPythonHome((const wchar_t *)(L"D:/ThePaK/Python3.8")); //这步很重要,没有它会在执行python脚本时,调用不了python已安装的库
    Py_Initialize();
    if( !Py_IsInitialized() )
        qDebug()<<"初始化失败";
        //导入sys模块设置模块地址
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    //QString setSysPath = QString("sys.path.append('%1')").arg(QCoreApplication::applicationDirPath());
    //PyRun_SimpleString(setSysPath.toStdString().c_str());
    //创建模块指针
    PyObject* pModule = PyImport_ImportModule("Py_Module");
    if (!pModule)
        qDebug()<<"获取模块指针失败";
    //创建函数指针
    PyObject* pFunc= PyObject_GetAttrString(pModule,"add");
    PyObject* pFunc2= PyObject_GetAttrString(pModule,"prin");
    if(!pFunc)
        qDebug()<<"获取函数指针1失败";
    if(!pFunc2)
        qDebug()<<"获取函数指针2失败";
    //无参函数
    PyObject* pPara2 = PyObject_CallFunction(pFunc2, 0);
    char* res3;
    PyArg_Parse(pPara2, "s", &res3);
    qDebug()<<"print(f):"<<res3;
    //创建函数参数,方法1
    PyObject* pPara = PyTuple_New(2);        // 2个参数
    PyTuple_SetItem(pPara, 0, Py_BuildValue("i",7));  //参数1为int型 1
    PyTuple_SetItem(pPara, 1, Py_BuildValue("i",2));  //参数2为int型 2
    //pPara = Py_BuildValue("(i,i)",1,2); //连写方式
    /*
    PyObject* pPara = PyTuple_New(2);        // 2个参数
    PyTuple_SetItem(pPara, 0, Py_BuildValue("s","Hello"));  //参数1为String型 "Hello"
    PyTuple_SetItem(pPara, 1, Py_BuildValue("s","World!"));  //参数2为String型 "World!"
    */
    //创建函数参数,方法2
    PyObject* args = PyTuple_New(2);        // 2个参数
    PyObject* arg1 = PyLong_FromLong(4);    // 参数一设为4
    PyObject* arg2 = PyLong_FromLong(3);    // 参数二设为3
    PyTuple_SetItem(args, 0, arg1);
    PyTuple_SetItem(args, 1, arg2);

    //调用Python函数,传入元组参数pPara
    PyObject *FuncBack = PyObject_CallObject(pFunc,args);
    //PyObject_CallObject(pFunc,nullptr); //无参数调用
    //FuncBack是返回值指针,转换获取返回值
    int res = 0;
    PyArg_Parse(FuncBack,"i",&res);
    qDebug()<<"返回值: "<<res;
    //调用结束,销毁
    Py_Finalize();

}

MainWindow::~MainWindow()
{
    delete ui;
}

   请注意,代码中的此句: 

Py_SetPythonHome((const wchar_t *)(L"D:/ThePaK/Python3.8"));

这步很重要,没有它会在执行python脚本时,调用不了python已安装的库

有问题欢迎交流~

### 如何在 Qt 中通过 QProcess 调用 Python 脚本Qt 应用程序中,可以使用 `QProcess` 类来调用外部程序或脚本。以下是具体方法以及完整的示例代码。 #### 创建 QProcess 对象 首先需要创建一个 `QProcess` 的实例对象用于管理子进程的启动和通信[^2]。 ```cpp #include <QCoreApplication> #include <QProcess> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建 QProcess 实例 QProcess process; QString program = "python"; // 或者指定完整路径如 "C:/Python39/python.exe" QStringList arguments; arguments << "/path/to/your_script.py" << "arg1" << "arg2"; // 添加参数 qDebug() << "Starting:" << program << arguments; // 启动子进程 process.start(program, arguments); if (!process.waitForStarted()) { qWarning() << "Failed to start the process."; return -1; } // 等待子进程完成 if (!process.waitForFinished(-1)) { // -1 表示无限期等待 qWarning() << "Process crashed or timed out."; return -1; } // 获取标准输出和错误输出 QByteArray output = process.readAllStandardOutput(); QByteArray errors = process.readAllStandardError(); qDebug() << "Standard Output:\n" << output; qDebug() << "Standard Error:\n" << errors; return a.exec(); } ``` 上述代码展示了如何设置 `QProcess` 来运行 Python 脚本,并传递必要的参数[^4]。注意替换 `/path/to/your_script.py` 和其他变量为你实际使用的值。 #### 处理跨平台兼容性 如果目标环境可能涉及多个操作系统,则需考虑不同平台上解释器的位置差异。例如,在 Windows 上通常会安装到特定目录下(如 `C:\PythonXX\python.exe`),而在 Linux/macOS 则可以直接使用 `python` 命令或者更推荐的是 `python3`[^5]。 另外需要注意的是,当涉及到相对路径时,最好先转换成绝对路径再传入给 `QProcess::start()` 函数以避免因当前工作目录变化而导致找不到文件的情况发生[^3]。 #### 错误处理机制 为了提高健壮性和用户体验,应该加入适当异常捕获逻辑以便于及时发现潜在问题并作出响应措施。比如检查是否成功开启新进程、监控其退出状态码等等[^1]。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值