VS2015下C++呼叫Python指令碼
阿新 • • 發佈:2019-01-24
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位置)