QT中 使用c++調用python


最近在做一個項目,開發環境用的是QT c++。項目中使用amazon雲服務,調研發現有一個Amazon雲的python接口。就有了標題中的問題,需要用C++來調用python腳本。

下面是一個c++調用python的小例子。我先貼出代碼,然后在詳細介紹。

# -*- coding: cp936 -*-
#定義hello函數,這個函數的功能是輸出“hello world!”
def hello():
    print("hello world!")

 

上面就是我們一會要用C++調用python腳本,你沒看錯,只有兩行,是不是很簡單,這也是我們為什么要調用Amazon雲的python接口的原因。

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

    //初始化python模塊
    Py_Initialize();
    if ( !Py_IsInitialized() )
    {
    return -1;
    }
    //導入test.py模塊
    PyObject* pModule = PyImport_ImportModule("test");
    if (!pModule) {
            printf("Cant open python file!\n");
            return -1;
        }
    //獲取test模塊中的hello函數
   PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello");
    //注釋掉的這部分是另一種獲得test模塊中的hello函數的方法
//    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;
    }
    //調用hello函數
    PyObject_CallFunction(pFunhello,NULL);
    //結束,釋放python
    Py_Finalize();
   return a.exec();

}

上面是C++調用python的代碼。要想具體了解這些Py**函數,可以去看看python手冊或者其他網絡資源,我看的是這個http://segmentfault.com/a/1190000000531613

這個測試工程的結構如下圖所示:

 

在運行之前需要進行配置,注意到main.cpp包含了一個Python.h的頭文件,這是調用python腳本必須的,同時我們還要配置這個工程的.pro文件,將python的include和lib包含進來。

配置如下所示:

這樣就可以調用python代碼了嗎?

來看看我們的運行結果:

可以看到,沒有打開python文件,為什么呢?

這是因為生成的exe文件和tests.py文件不在同一個文件夾里,只要手動將test.py拷貝到exe文件同級目錄下即可。

然后我們再來試下:

成功了!

就到這里了,有問題的地方歡迎指出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM