一、概述
最近因为课题的进展遇到了一些麻烦,需要对一些文件进行解析,原本是用C++代码解析的,但是因为对Eigen的不熟练以及一些C++版本的问题遇到了比较难以解决的困难,由于时间紧急,暂且搁置,转用python代码解析。项目是用QT做的,所以就需要将C++与python结合起来,所以简单摸索了一下,较为顺利,在此简单记录。(正好顺道应用一下刚学的Markdown,嘿嘿)
二、工程建立
- 新建工程
首先新建QT项目,
建立项目之后,左侧右击项目,添加python文件
然后选择你需要添加文件的具体位置,这里需要把文件添加到项目工程.exe的同一目录下,这样就可以实时修改py文件,进行同步调用了,否则就会出现想很多博客中所说的需要将新建立的py文件再复制到工程目录中,那么每修改一次py文件,就需要重新复制一次,非常麻烦。
这样就新建了一个python文件,在这个文件里写上你需要的代码,例如:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def hello():
print("helloworld")
- 添加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” 错误。当然,不同的路径需要根据自己的情况修改。
- 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模块(详细记录)
发布评论