Windows下Qt调用python代码

帮助到你了就点个赞吧!

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作为变量,所以有冲突,办法是:

https://www.2cto.com/uploadfile/Collfiles/20171208/2017120809155325.png

运行时又会报错:The process was ended forcefully

这时需要将需要调用的python文件复制一份放入编译生成的可执行文件的同级目录下(build生成的那个目录下)。


帮助到你了就点个赞吧!

Powered By Longer-站在巨人的肩膀上

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值