Qtcreator中C++调用python方法

最近可能需要做一个项目,可能需要c++中调用python,在网上找了一些资料学习了一下。

1. 创建c++ 和 python文件

  1. 首先在qtcreator创建一个qt console application

在这里插入图片描述

  1. 然后在项目中添加一个python文件:
    在这里插入图片描述

  2. 最后项目结构如下图所示:
    在这里插入图片描述

2. 修改python和c++文件

2. 1 修改test_py.py文件如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def hello():
    print("hello world!")

2.2 修改main.cpp文件如下

#include <QCoreApplication>
#include <Python.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Py_Initialize();
    if ( !Py_IsInitialized() )
    {
    return -1;
    }
    PyObject* pModule = PyImport_ImportModule("test_py");  // 这里的test_py就是创建的python文件
    if (!pModule) {
            cout<< "Cant open python file!\n" << endl;
            return -1;
        }
   PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello");  // 这里的hellow就是python文件定义的函数
//    PyObject* pDict = PyModule_GetDict(pModule);
//       if (!pDict) {
//           printf("Cant find dictionary.\n");
//           return -1;
//       }
//    PyObject* pFunhello = PyDict_GetItemString(pDict, "hello");

    if(!pFunhello){
        cout<<"Get function hello failed"<<endl;
        return -1;
    }
    PyObject_CallFunction(pFunhello,NULL);
    Py_Finalize();

   return a.exec();
}

3. 运行程序

qmake, 然后构建,最后运行
在这里插入图片描述

3.1 错误1:找不到Python.h

  1. 出现原因: 因为我们在c++中使用这个了头文件,因此出现了找不到python.h
  2. 解决办法: 在.pro文件中添加python的头文件以及静态链接库。

添加代码:

INCLUDEPATH +=E:\Users\Administrator\Anaconda3\envs\python3env\include   ############# python enviroment
LIBS += -LE:\Users\Administrator\Anaconda3\envs\python3env\libs\
-l_tkinter\
-lpython3\
-lpython36

在这里插入图片描述

这里有几点需要说明一下:

  1. 这里E:\Users\Administrator\Anaconda3\envs\python3env\includeE:\Users\Administrator\Anaconda3\envs\python3env\libs\是我的python的路径,具体到个人的话需要自行修改的。姑且认为读者对这个应该比较熟悉了。
  2. 另外这里的LIBS中-LE:\Users\Administrator\Anaconda3\envs\python3env\libs\ 中间不能打空格!不然会出现错误: LNK1146: 没有用选项“/LIBPATH:”指定的参数

3. 2 错误2:error: C2238: 意外的标记位于“;”之前

这里还需要提醒一点,在进行上面的修改之后,一定需要保存文件。 然后还需要执行qmake, 构建,运行步骤。 因为我一开始仅仅执行了运行步骤,所以一直相当于没有进行修改。

完成上面添加python路径之后,我们是可以正确找到python的文件的,但是这个时候又出现新的错误,如下:
在这里插入图片描述

出现的原因: 由于QT中定义了slots作为关键了,而python3中有使用slot作为变量,所以有冲突
解决方法:在python的object.h中 slots冲突,因此修改object.h,我的object.h路径:E:\Users\Administrator\Anaconda3\envs\python3env\include\object.h
对448行进行修改:

修改之前:
在这里插入图片描述

修改之后:
在这里插入图片描述

然后在保存, cmake , 构建, 运行!

3. 3 出现错误: error: LNK1104: 无法打开文件“python36_d.lib”

在这里插入图片描述

问题: 无法打开 python36_d.lib 的问题
解决: Anaconda3 的 pyconfig.h 文件中做出修改。 我的pyconfig.h路径:
E:\Users\Administrator\Anaconda3\envs\python3env\include\pyconfig.h

将293行的,python36_d.lib改成python36.lib
在这里插入图片描述

改成:
在这里插入图片描述

同时注释337行:
在这里插入图片描述

3.4 编译的时候没有什么错误了,运行时候出现,“cant open python file!”

运行到这里的话,表示我们离成功已经不远了,这个时候出现这个错误的原因是: 成的exe文件和test_py.py文件不在同一个文件夹里,只要手动将test_py.py拷贝到exe文件同级目录下即可。

这个时候生成的文件如图所示:
在这里插入图片描述

我们需要把test_py.py拷贝到这里:
在这里插入图片描述

最后我们在c_make, 编译,运行一下:
在这里插入图片描述

出现我们期望的结果。

over

有问题,多google。 实践出真知!

猜你喜欢

转载自blog.csdn.net/alxe_made/article/details/83382159