windows下Qt5调用含三方库的python文件

  • 前言:再经过几天的失败后,终于解决这一问题,虽然这几天的大多操作几乎一样,就是不行,可能这就是细节决定成败吧。

  • 主要环境:

    • Qt5(Cpp)
    • MSVC2017(64bit)
    • Python38(64bit);

基本步骤

1. 创建项目

  1. 新建一个项目(随便什么项目,不重要,Qt c++的就行),我在这里建立的是Widgets
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1r8rlQO9-1619168138874)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423141637924.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogPGl7W8-1619168138876)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423141613885.png)]

  2. 这一步很重要MSVC2017 64Bit一定要选上(下面那个无所谓,在我这里可选可不选,这个我也不太懂),反正用MinGWMSVC是不一样的,我在这里只选择前者。然后傻瓜式操作,现将项目建立。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkXDrT4F-1619168138886)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423142033973.png)]

2. 引入库文件以及包含Python头文件

  1. 项目的.pro文件中右键添加库外部库
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XWqLe95n-1619168138889)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423142336904.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CxxIIFx6-1619168138890)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423142418667.png)]

  2. 按照下图点击库文件后面的浏览找到自己的pythonxx.lib文件,下面其他的地方,按图中勾选。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c3TbLaBu-1619168138892)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423142639435.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-soSrGLDQ-1619168138893)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423142706139.png)]

  3. 在**.pro文件中在添加python头文件**所在的路径,代码如下:
    PS:

    • 不添加以下代码是找不到Python.h头文件的
    • 路径最好用双引号【""】或者单引号【’’】包裹,因为路径可能含有特殊字符或者空格,容易出问题,血泪史。
    • 如果不加双引号或者单引号,请使用【/】表示下级目录,而不是【\】,后者在**.pro**文件中表示换行的衔接符。
    # 第一种写法(绝对路径):
    INCLUDEPATH += 'D:/Program Files/anaconda3/include'
    
    # 第二种写法(相对路径):
    INCLUDEPATH += $$PWD/'../../../Program Files/anaconda3/include'
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-htTri0Lo-1619168138894)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423143238671.png)]

3. 编写C++文件

主要内容放在那,就是你的逻辑问题了,这里作为主要演示,放置在main.cpp

  • slots宏定义重复问题;
#include "widget.h"
#include <QApplication>

#undef slots
#include <Python.h>
#define slots Q_SLOTS 
/* 这几行代码是因为python中有个object.h文件中slots的宏定义和Qt中的slots重复定义了,这里我们将python中slots定义为和Qt一样就好了*/

#include <iostream>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;

    /* 调用python代码 */
    Py_Initialize();  /* 表示调用开始 */
    if(!Py_IsInitialized()){
        std::cout << "initialize failed" << std::endl;
        return -1;
    }
    PyObject *pModule, *pFunc;
    /* 调用的python文件,该字符串就是python文件名 */
    const char *pyFileName = "test_py";
    pModule = PyImport_ImportModule(pyFileName);
    if(!pModule){
        std::cout << "open python file failed" << std::endl;
        return -1;
    }
    const char *pyFuncName = "hello";  /* 需要调用的python文件中的函数名 */
    pFunc = PyObject_GetAttrString(pModule, pyFuncName);
    if(!pFunc){
        std::cout << "find function failed" << std::endl;
        return -1;
    }
    /* 函数调用 */
    PyObject_CallFunction(pFunc, nullptr);

    Py_Finalize();  /* 表示调用结束 */
    /* 调用代码结束 */
    w.show();

    return a.exec();
}

4. python示例文件简单编写

文件名py_test.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
def hello():
    print(np.__version__)
    print(np.array([[1,2,3],[4,5,6]]))
    print("hello world")

5. 项目的部署调用

  1. qmake编译;
  2. 构建;
  3. 将需要调用的python文件python3.dllpython38.dll,拷贝到debug或者release目录下;
  4. 运行即可;
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9aVWQdwq-1619168138898)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423163027494.png)]

注意事项汇总

  1. kit选择,MSVC2017

  2. 外部库添加,在项目的.pro文件中右键添加库外部库

  3. 包含python头文件路径;

    # 第一种写法(绝对路径):
    INCLUDEPATH += 'D:/Program Files/anaconda3/include'
    
    # 第二种写法(相对路径):
    INCLUDEPATH += $$PWD/'../../../Program Files/anaconda3/include'
    
  4. slots重定义;

    #undef slots
    #include <Python.h>
    #define slots Q_SLOTS 
    
  5. PYTHONHOME未设置;

    Py_SetPythonHome((const wchar_t *)(L"D:/anaconda")); 
    

    对我没起作用,我的做法是在环境变量里添加了PYTHONHOME,再加上自己的anaconda的路径;

  6. Python.h文件找不到;
    python文件python3.dllpython38.dll,拷贝到debug或者release目录下;

  7. 编译成功无结果,将pythonxx.dll拷贝一份到libs目录下;

  8. 无法启动此程序因为计算机丢失qt5cored.dllqt5widgets等;
    以及python文件中导入了三方包如numpy等;
    添加环境变量到用户变量path(根据自身情况调整,有些路径不一定都有,并不重要):

    D:\Program Files\anaconda3;
    D:\Program Files\anaconda3\Library\mingw-w64\bin;
    D:\Program Files\anaconda3\Library\bin;
    
    D:\ProgramData\QT\Qt5.11.3\5.11.3\msvc2017_64\bin;
    D:\ProgramData\QT\Qt5.11.3\Tools\QtCreator\bin;
    

主要参考

ps:参考文献不止这些,这是比较有用的,排名不分先后,感谢。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值