1. 程式人生 > >Qtcreator中C++呼叫python方法

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。 實踐出真知!