1. 程式人生 > >VS2015下C++呼叫Python指令碼

VS2015下C++呼叫Python指令碼

C++呼叫Python在一些特殊的場景下有一定的價值。比如,要呼叫一個REST服務,c++本身做HTTP Client會很煩,如果使用Python指令碼去呼叫服務,返回結果給c++端就可以繞開這個問題。因為最近在一個原型開發中遇到了這個問題,所以為了快速拿出東西來,我決定使用這種方法。

使用效果一般,主要是太慢用來做demo還行,可能是我還沒用好。

官方文件

https://docs.python.org/2/extending/embedding.html

環境

-python  27 (D:/python27)

-Vs2015 

Helloworld

#include<Python.h>void main(){ Py_SetPythonHome("D:\\Python27"); Py_Initialize();
#include<Python.h>void main(){ Py_SetPythonHome("D:\\Python27"); Py_Initialize();
 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')");//.py所在路徑
//如果不知道具體路徑,可通過輸出路徑然後改改相對路徑 
//auto str = Py_GetPath(); //std::cout << str << std::endl;
 PyObject * pModule = NULL; PyObject * pFunc = NULL; PyObject *pName = PyString_FromString("pytest"); pModule = PyImport_Import(pName); pFunc= PyObject_GetAttrString(pModule, "Hello"); PyEval_CallObject(pFunc, NULL); Py_Finalize(); system("pause");}
pytest.py

 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')");//.py所在路徑
//如果不知道具體路徑,可通過輸出路徑然後改改相對路徑 
//auto str = Py_GetPath(); //std::cout << str << std::endl;
 PyObject * pModule = NULL; PyObject * pFunc = NULL; PyObject *pName = PyString_FromString("pytest"); pModule = PyImport_Import(pName); pFunc= PyObject_GetAttrString(pModule, "Hello"); PyEval_CallObject(pFunc, NULL); Py_Finalize(); system("pause");}
pytest.py
def Hello():
 print "Hello, world!"

配置環境

注意配置的平臺win32....和開發環境一致

1.在專案->C/C++中新增附加包含目錄(Python安裝位置下的Include資料夾,標頭檔案位置)

2.在連結器->輸入->附加依賴庫加上python27.lib

3.在連結器->常規->附加庫目錄中新增庫目錄(Python安裝位置下的lib資料夾,python27_d.lib位置)