配置过程参考多个帖子,未能尽数援引请见谅
背景故事
第一次做软件项目,软件里需要调用多个软件,所以选用了兼容性较好的32位的QT环境,希望能够通过QT调用python跑神经网络(之前用python写过keras+tensorflow),由于tensorflow仅支持64位,所以需要用keras+theano来配合32位python。
配置环境的顺序为:
- QT+MSVC2017-32bit(QT5.12.9)
- Python创建环境、切换到32位、下载32位python(python3.6)、安装keras+theano
- QT调用python
——下载安装QT——
下挺久了,忘记步骤了,所以不说了嗷
——32位Python——
切换到32位
打开Anaconda Prompt,此时通常显示
(base) C:\Users\(你的用户名)>
输入
set CONDA_FORCE_32BIT=1
就可以把anaconda暂时变成32位平台,这样下载下来的文件都是32位的(下一次打开Anaconda Prompt要记得再输一次该代码)。想要验证的话,可以输入
conda info
就可以得到如下图所示的结果,这么多32应该很容易看到
创建环境+下载32位python+安装theano
(base) 是你的主环境,一般来说都2020年了应该都是64位的了,为了下载32位python,需要开辟一个新环境。这里提供一个一步到位的方法
conda install m2w64-toolchain
conda create -n newenv python=3.5 m2w64-toolchain theano
第一句我的网速还行,下载挺快,但网上说下载可能比较慢,当然解决方法也一搜一大把
第二句的newenv可以换成你喜欢的名字,这就是为32位准备的环境了,路径一般在···\Anaconda\envs\newenv
进入新环境
输入
conda activate newenv
conda activate后可以是环境名,也可以是环境的绝对路径
安装keras及其他第三方库
安装之前最好先检查一下是不是32位的平台,下载安装keras及其他第三方库主要使用conda install或者pip install,其中,keras版本太高可能会下不下来,可能需要指定版本,输入
pip install keras==2.1.2
pip install numpy==1.19.5
keras换backend
keras一般默认用tensorflow作为后端,要更换后端的话,需要去C:\Users\(你的用户名)\ .keras下的keras.json进行改写,用记事本打开该文件
{
“floatx”: “float32”,
“epsilon”: 1e-07,
“backend”: “tensorflow”,
“image_dim_ordering”: “th”
}
将第三行的tensorflow改为theano
{
“floatx”: “float32”,
“epsilon”: 1e-07,
“backend”: “theano”,
“image_dim_ordering”: “th”
}
完成后,可以进入python,输入import keras,会显示Using Theano backend.,这就是后端换成功了
创建 .theanorc.txt
如果有报错,可能需要创建.theanorc.txt,在C:\Users\(你的用户名) 下新建txt文件,命名为.theanorc(注意最前面那个点),在txt里写入
[blas]
ldflags=
对于.theanorc.txt里的内容,网上有很多种,如果这种不行就换一种。另外,该文件修改后需要重启电脑才能生效。
当然可能还会有各种各样的报错,就需要自己捏着报错去网上搜索了哦。
——QT调用python——
import keras后没有报错就可以着手进行QT调用了。
主要参考帖子
QT中启动python脚本(环境配置+demo)
修改object.h文件
object.h文件在···\Anaconda\envs\newenv\include下,需要将443行的
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
换成
#undef slots
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
#define slots Q_SLOTS
添加 python36_d.lib
将···\Anaconda\envs\newenv\libs里的python36.lib复制一份儿在该目录下,命名为python36_d.lib。
修改QT project
复制dll文件
从Anaconda文件夹下找到以下几个dll文件,并将其复制到QT工程的debug文件夹下
修改pro文件
在pro文件中写入以下语句,当然要使用你自己的路径
INCLUDEPATH +=D:\Anaconda\envs\newenv\include ############# python enviroment
LIBS += -LD:\Anaconda\envs\newenv\libs\
-l_tkinter\
-lpython3\
-lpython36
添加环境变量
然后在项目里的环境变量中加入PYTHONHOME和PYTHONPATH,路径分别为···\Anaconda\envs\newenv 和 ···\Anaconda\envs\newenv\Lib 。
修改cpp文件
用main.cpp写一个示例。首先创建一个py文件,写入一个简单的函数,要求输出字段succeed
import keras
def writetest():
print('succeed')
return
再把新创建的main.cpp写成
#include "widget.h"
#include <QApplication>
#include <QDebug>
#include <Python.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
Py_Initialize();
if ( !Py_IsInitialized() )
{
return -1;
}
PyObject* pModule = PyImport_ImportModule("testforqt"); // 这里的testforqt就是创建的python文件
if (!pModule) {
qDebug()<< "Cant open python file!\n" << endl;
return -1;
}
PyObject* pFunhello= PyObject_GetAttrString(pModule,"writetest"); // 这里的writetest就是python文件定义的函数
if(!pFunhello){
qDebug()<<"Get function hello failed"<<endl;
return -1;
}
PyObject_CallFunction(pFunhello,NULL);
Py_Finalize();
return a.exec();
}
点击debug,就可以发现输出succeed,就成功啦