QT调用Python脚本(无参,有参,返回值)详细讲解,避坑手册
因为工作需要,用QT调用Python脚本。网上查了一大堆,踩了无数的坑。终于算是可以了啊。
一个电脑小白的自我成长之路,总是那么漫长,充满疑惑苦恼,无奈,和成功之后的喜悦,开心,欣喜。
1.QT5.12安装
由于现在的Python版本基本都是3.7及其以上版本,基本都是64位。所以,先将QT版本也换一换,最少要换成64位的,我就在这踩的一个深深的坑。
QT5.12以及以上版本安装,直接截图啦。Qt5.12下载网址: http://download.qt.io/archive/qt/5.12/5.12.2/
(选择这个,64位安装包大包在里面,别看名字以为是32位哈,不注意这也是一个小坑)
下载完后,打开文件夹。
右键,管理员身份运行(避免安装过程,360老弹修改啥啥,允许阻止啥的)
运行后,出现下面界面,点击next.
输入自己注册的QT账号,和密码。如果没有,填signup,下面3行。邮箱,密码(密码需要有大写字母,小写字母,数字组成)然后,next。(没有账号的,QT会发送一个认证到你的邮箱,需要登录邮箱进行认证)
后面就下一步,然后选择这两个组件
点击我同意I agree.后面一路下一步,等待安装完成。
2.创建Python文件
文件名为aa.py(注意文件名不要写test,这也是一个坑,因为pyhon环境中有test.py文件,名字冲突啦)
def show():
print("hello!")
def sum(a,b):
return (a+b)
def main():
show()
print(sum(1,2))
if __name__ == '__main__':
main()
3.打开QT
点击newProject,创建一个新QT项目名字为05_QtincludePython(名字自己取就行),然后右键,添加库
选外部库,下一步
接着,将自己电脑中的python安装环境的libs和include文件夹路径添加到里面,Windows打钩,其他不选。如下
添加后,.pro文件中,会出现如下几行包含路径代码,将下方的4行注释掉,保留上方4行(这里也是一个坑,太鸡儿坑啦)
运行一下你的QT文件,生成对应的build-05_QtincludePython-Desktop_Qt_5_12_6_MinGW_64_bit-Debug文件。很长,很长!!!!!!请记住它
**环境变量对应添加:**电脑→属性→高级系统设置→
环境变量→path
4.python动态库,静态库相应修改
在python的libs文件中(前面添加的文件路径),添加python3.dll,python37.dll两个动态库,(这两个动态库在libs文件的外层文件Anaconda3中,认真找别找错了),然后将python37.lib复制一下并重新命名为python37d.lib,也放在libs文件中。(此处坑多)
5.放入python文件脚本
将自己写好的python脚本放入build-05_QtincludePython-Desktop_Qt_5_12_6_MinGW_64_bit-Debug文件debug文件中
6.在QT文件中添加调用代码
在sources源文件中添加代码:
初始化前添加这行代码 Py_SetPythonHome(L"E:/Users/dell/Anaconda3"); //这一步很重要哈,又可能QT找不到python根目录
坑了我几个小时,一直报ModuleNotFoundError: No module named ‘encodings‘
的错误。网上查查,终于找到了,原因是没有找到python的根目录
Py_SetPythonHome(L"E:/Users/dell/Anaconda3"); //这一步很重要哈,又可能QT找不到python根目录
Py_Initialize();
Py_Initialize();
//如果初始化失败,返回
if(!Py_IsInitialized())
{
qDebug()<<"Python init fail!";
return a.exec();
}
//设置python文件路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
//加载aa.py文件
PyObject *pModule = PyImport_ImportModule("aa"); //注意python文件不要取名为test.py,会与python库文件冲突
if(!pModule)
{
qDebug()<<"load pModule(testfile.py) fail!";
return a.exec();
}
//加载函数show
PyObject* pFun_show= PyObject_GetAttrString(pModule,"show");
if(!pFun_show)
{
qDebug()<<"Get pFun_show(show) failed!";
return a.exec();
}
//加载函数sum
PyObject* pFun_sum= PyObject_GetAttrString(pModule,"sum");
if(!pFun_sum)
{
qDebug()<<"Get pFun_sum(sum) failed!";
return a.exec();
}
运行如有下面的错误,请一一修改。我想按照我上面的来,基本没有什么错误啦
“哎呀吗呀,咋还有错”。哈哈,如果还有欢迎留言**&_***