最近在做一個項目,開發環境用的是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文件同級目錄下即可。
然后我們再來試下:
成功了!
就到這里了,有問題的地方歡迎指出。