一、概述

  最近因为课题的进展遇到了一些麻烦,需要对一些文件进行解析,原本是用C++代码解析的,但是因为对Eigen的不熟练以及一些C++版本的问题遇到了比较难以解决的困难,由于时间紧急,暂且搁置,转用python代码解析。项目是用QT做的,所以就需要将C++与python结合起来,所以简单摸索了一下,较为顺利,在此简单记录。(正好顺道应用一下刚学的Markdown,嘿嘿)

二、工程建立

  1. 新建工程
    首先新建QT项目,

    建立项目之后,左侧右击项目,添加python文件


    然后选择你需要添加文件的具体位置,这里需要把文件添加到项目工程.exe的同一目录下,这样就可以实时修改py文件,进行同步调用了,否则就会出现想很多博客中所说的需要将新建立的py文件再复制到工程目录中,那么每修改一次py文件,就需要重新复制一次,非常麻烦。

    这样就新建了一个python文件,在这个文件里写上你需要的代码,例如:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def hello():
    print("helloworld")
  1. 添加python路径
    想要调用python模块,需要在项目的.pro文件中添加目录,例如:
INCLUDEPATH += C:\Users\ALIENWARE\AppData\Local\Programs\Python\Python37-32\include

LIBS += -LC:\Users\ALIENWARE\AppData\Local\Programs\Python\Python37-32\libs\
-l_tkinter\
-lpython3\
-lpython37

注意! 在添加LIBS时,一定要在目录前添加-L,否则会出现 "can’t find *** :permission denied” 错误。当然,不同的路径需要根据自己的情况修改。

  1. python模块调用
    下面直接上调用python模块的C++代码:
int main()
{
    Py_Initialize();
    if(!Py_IsInitialized())
    {
        return -1;
    }
    PyObject* pModule = PyImport_ImportModule("transformMatrixExt");
    if(!pModule)
    {
        cout<<"open failure"<<endl;
        return -1;
    }
    PyObject* pFunhello = PyObject_GetAttrString(pModule,"hello");
    if(!pFunhello)
    {
        cout<<"get function hello failed"<<endl;
        return -1;
    }
    PyObject_CallFunction(pFunhello, NULL);
    Py_Finalize();
}

这里有两个点,1,上面的 “transformMatrixExt” 就是新建的py文件名;2,“hello” 就是所需要调用的py文件中的函数名。

三、项目结构与运行结果


四、import packages

前面三步对于调用只引入了内部package的python程序是可以的,但是如果需要调用外部的package,那么就会出现无法打开py文件的情况,就是会出错。这里我也看了很多博客,但是我觉得要么不是我要解决的问题,要么就非常麻烦,所以我就自己尝试着摸索了一下。

如果需要引入别的一些package的话,就需要将所需要的package文件复制到QT工程目录的debug文件夹下(根据自身情况选择debug或者release),例如numpy这个package,如下:

那么numpy这个package是哪里来的呢?
因为我安装了pycharm,所以我直接在pycharm上pip了一下(具体安装步骤见 Python+Selenium多线程基础微博爬虫),然后我再找到这个numpy包的目录,直接复制粘贴到debug文件夹下即可。

当然,这只是一个简单的例子,可以根据不同的需求建立不同的工程,调用不同的py模块,灵活运用。
本文参考了以及调用模块的代码来源Qtcreator中C++调用python方法,感谢。
最后,Markdown还不错,hhh

更多推荐

QT C++调用Python模块(详细记录)