帮助到你了就点个赞吧!
Powered By Longer-站在巨人的肩膀上
Windows下Qt调用python代码
我的环境:
Win10x64
Python3.6
Qt5.7.0
Qt Creator4.0.2
问题描述:
Windows下Qt调用python的方法以及遇到的各种奇葩问题
步骤:
1.安装python(方法太多了,自己百度吧。)
2.配置好系统的环境变量(右击此电脑-属性-高级系统设置-高级-环境变量-新建用户变量(设置系统变量也行,需要重启电脑,而设置用户变量后重启qt就行)
新建下面两个变量:
变量 值
PYTHONPATH D:\python
PYTHONHOME D:\python
3.打开qt,新建控制台程序(Qt Console Application)。注意,所有文件的命名不建议使用test,可以使用其他有区分度的名字。
4.我这里是qt调用pythonmain.py这个文件,在windows控制台里面打印出hello world!,如果你的python文件名字不一样,需要在pro文件的OTHER_FILES,main文件里面改一下对应的名称即可。python文件编辑完成后建议在qt工程的源码目录和build输出目录都放一份。
5.pro文件中,我只在自动生成的文件里面加了OTHER_FILES、INCLUDEPATH和LIBS三项,windows中,INCLUDEPATH和LIBS的格式需要和程序代码中的一致,把其中的路径换成自己的就行。(LIBS中,-L和D之间没有空格,如果你的是python27,那么最后的-lpython36_d要换成-lpython27_d,如果你没有debug版本的python lib,可以从我的github下载下来直接使用(GitHub - YalongLiu/python36-libs-debug-: the debug version of python36 libs))
程序代码如下:
Pro文件:
QT += core
QT -= gui
CONFIG += c++11
TARGET = qtpython
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
OTHER_FILES += pythonmain.py
INCLUDEPATH +=D:/python36/include
LIBS += -LD:/third/python3 -lpython36_d
Main.cpp
#include <QCoreApplication>
#include <Python.h>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Py_Initialize();
if( !Py_IsInitialized() )
{
return -1;
}
PyObject* pModule = PyImport_ImportModule("pythonmain");
if(!pModule)
{
printf("Cannot open python file!\n");
return -1;
}
PyObject* pFunmain = PyObject_GetAttrString(pModule,"main");
//注释掉的这部分是另一种获得test模块中的hello函数的方法
// PyObject* pDict = PyModule_GetDict(pModule);
// if (!pDict) {
// printf("Cant find dictionary.\n");
// return -1;
// }
// PyObject* pFunhello = PyDict_GetItemString(pDict, "hello");
if(!pFunmain)
{
qDebug()<<"Get function hello failed";
return -1;
}
//调用hello函数
PyObject_CallFunction(pFunmain,NULL);
//结束,释放python
Py_Finalize();
return a.exec();
}
pythonmain.py
def main():
print("hello world!")
常见问题:
1. Fatal Python error:
Py_Initialize: unable to load the file system codec
解决:要设置python的系统变量啊,PYTHONHOME和PYTHONPATH都设置好。详细如上面步骤2所述。
2. error: expected unqualified-id before ';' token
由于QT中定义了slots作为关键了,而python3中有使用slot作为变量,所以有冲突,办法是:
运行时又会报错:The process was ended forcefully
这时需要将需要调用的python文件复制一份放入编译生成的可执行文件的同级目录下(build生成的那个目录下)。
帮助到你了就点个赞吧!
Powered By Longer-站在巨人的肩膀上