QtCreator中C++调用python的方法

QtCreator中C++调用python的方法

软工课程的界面使用QT做的,而其中核心的情感预测是python写的,模块融合的时候需要C++和python混合编程。在配置的过程中踩了不少坑,特此记录警醒后人😭

1. 在qtcreator中创建 qt application

项目选择无所谓的,对是否成功配置没什么影响

2. 修改c++文件

修改main.cpp文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <QCoreApplication>
#include <Python.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

Py_Initialize();
if ( !Py_IsInitialized() )
{
return -1;
}
PyObject* pModule = PyImport_ImportModule("test_py"); // 这里的test_py就是创建的python文件
if (!pModule) {
cout<< "Cant open python file!\n" << endl;
return -1;
}
PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello"); // 这里的hellow就是python文件定义的函数
if(!pFunhello){
cout<<"Get function hello failed"<<endl;
return -1;
}
PyObject_CallFunction(pFunhello,NULL);
Py_Finalize();
return a.exec();
}


3. 修改.pro文件

pro

这里有两种方式进行修改:

方法一 添加外部库进行修改

1.右键项目名称添加库

2.选择外部库

3.库文件和包含路径如图所示

库文件是本地python文件夹下的lib文件,具体路径如图所示

包含路径是这样的

点击下一步,完成即可

此时你的.pro文件里增加了如下代码:

1
2
3
4
5
6
7
8
9
10
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../../software/python3.9.15/libs/ -lpython310
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../../software/python3.9.15/libs/ -lpython310d

INCLUDEPATH += $$PWD/../../../../../software/python3.9.15/include
DEPENDPATH += $$PWD/../../../../../software/python3.9.15/include

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../../../../software/python3.9.15/libs/libpython310.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../../../../software/python3.9.15/libs/libpython310d.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../../../../software/python3.9.15/libs/python310.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../../../../software/python3.9.15/libs/python310d.lib

但在这其中有些代码中涉及的库文件是本地不存在的,所以需要进行修改。只保留LIBSINCLUDEPATH的路径,其余的注释掉。如图所示

方法二 手动添加代码

在.pro文件的最后加上:

1
2
3
LIBS += -L$$PWD/../../../../../software/python3.9.15/libs/ -lpython310

INCLUDEPATH += $$PWD/../../../../../software/python3.9.15/include

注意这些路径要改为自己python的路径

lpython310是libs文件夹下python310.dll库文件

4. 添加python文件

示例代码

1
2
3
def hello():
print("hello")
hello()

5.构建运行程序

注意构建运行时一定要选对编译模式和对应机器的位数

(哥们选择的是64位和debug运行模式)

哥们的文件在32位gcc编译模式下就会报一堆错,切记切记!

至于选择debug还是release模式,网上参考的博客说release模式成功的可能性大。哥们两种模式都尝试了,全部构建成功。这个大伙自行斟酌。

此时程序会报一些错误,不要慌张,这些坑哥们都已经踩过了

在运行程序后,qt会自动构建debug文件夹

此时可以在项目中添加新文件,路径选择为debug文件夹,文件就是刚刚的python文件。换句话说,这一步就是将python文件放置于和exe文件相同的文件夹下。我的路径为

D:\my_code\QTDemo\Python&QT\SoftwareEngineering-NLP-Model\build-DEMO-Desktop_Qt_5_14_2_MinGW_64_bit-Debug\debug

你以为只添加python文件就够了吗?非也非也

网上的博客通常讲到这一步就结束了,我跟到这一步后发现自己的python文件依旧跑不起来,而且报错显示的是python路径问题,长这个样子。

仔细分析一下sys.path,发现所有路径文件中好像dll的库文件没有引入,故尝试将dll文件复制进debug文件夹,故障解决。呦吼!这些文件需要到下载的python文件夹中找。

需要提醒一点的是,在进行上面的修改后,需要保存文件。然后需要执行qmake,构建,运行步骤。这样整个工程才会保留这些更改重新开始构建。

可能遇到的问题及解决

1. 找不到python.h

原因是我们在c++中使用了这个头文件,但没有添加相应的python动态链接库

解决方法:内容详情请见修改.pro文件

2. error: C2238: 意外的标记位于“;”之前

原因是QT中定义了slots作为关键了,而python3中有使用slot作为变量,所以有冲突。

解决方法:在python的object.h中 slots冲突,因此修改object.h,我的object.h路径:

D:\software\python3.9.15\include\object.h

修改如下

3. 编译时没有错误,运行时出现“cant open python file!”

可能原因

1.是生成的exe文件和test_py.py文件不在同一个文件夹里,只要手动将test_py.py拷贝到exe文件同级目录下即可。

2.前面的调用只引入了内部package的python程序是可以的,但是如果需要调用外部的package,那么就会出现无法打开py文件的情况。

如果需要引入别的一些package的话,就需要将所需要的package文件复制到QT工程目录的debug文件夹下(根据自身情况选择debug或者release),例如我的工程项目需要引入numpy,keras和tensorflow的包,如下:

这些包来自于下载的python文件夹下,我的路径为:

D:\software\python3.9.15\Lib\site-packages

可以根据自己的工程需要进行添加

这玩意的配置就无限踩坑,还好最后成功啦!最后放上运行成功截图✨✨✨