標籤:
最近在做一個項目,開發環境用的是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檔案同級目錄下即可。
然後我們再來試下:
成功了!
就到這裡了,有問題的地方歡迎指出。
QT中 使用c++調用python