-
前言:再经过几天的失败后,终于解决这一问题,虽然这几天的大多操作几乎一样,就是不行,可能这就是细节决定成败吧。
-
主要环境:
- Qt5(Cpp)
- MSVC2017(64bit)
- Python38(64bit);
基本步骤
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)]
-
这一步很重要,MSVC2017 64Bit一定要选上(下面那个无所谓,在我这里可选可不选,这个我也不太懂),反正用MinGW和MSVC是不一样的,我在这里只选择前者。然后傻瓜式操作,现将项目建立。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkXDrT4F-1619168138886)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423142033973.png)]
2. 引入库文件以及包含Python头文件
-
在项目的.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)] -
按照下图点击库文件后面的浏览找到自己的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)] -
在**.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. 项目的部署调用
- qmake编译;
- 构建;
- 将需要调用的python文件、python3.dll、python38.dll,拷贝到debug或者release目录下;
- 运行即可;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9aVWQdwq-1619168138898)(C:\Users\Danie\AppData\Roaming\Typora\typora-user-images\image-20210423163027494.png)]
注意事项汇总
-
kit选择,MSVC2017;
-
外部库添加,在项目的.pro文件中右键–添加库–外部库;
-
包含python头文件路径;
# 第一种写法(绝对路径): INCLUDEPATH += 'D:/Program Files/anaconda3/include' # 第二种写法(相对路径): INCLUDEPATH += $$PWD/'../../../Program Files/anaconda3/include'
-
slots重定义;
#undef slots #include <Python.h> #define slots Q_SLOTS
-
PYTHONHOME未设置;
Py_SetPythonHome((const wchar_t *)(L"D:/anaconda"));
对我没起作用,我的做法是在环境变量里添加了PYTHONHOME,再加上自己的anaconda的路径;
-
Python.h文件找不到;
python文件、python3.dll、python38.dll,拷贝到debug或者release目录下; -
编译成功无结果,将pythonxx.dll拷贝一份到libs目录下;
-
无法启动此程序因为计算机丢失qt5cored.dll、qt5widgets等;
以及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;
主要参考
- QT调用python脚本时遇到的坑(十一大坑全有)_herr_kun的博客-优快云博客_qt调用python脚本
- Qtcreator中C++调用python方法_暮日落流年的博客-优快云博客_qt调用python
- Qt中C++引用python文件和函数(联合编程)_泱生的博客-优快云博客
ps:参考文献不止这些,这是比较有用的,排名不分先后,感谢。