C++中嵌入Python的環境搭建
阿新 • • 發佈:2018-11-09
1、包含python環境:
注意:python36.lib去路徑下copy一份命名為python36_d.lib,在下面載入上去,此處沒改。
2、編寫CppPython.py
def add(a,b): print ("in python function add") print ("a = " + str(a)) print ("b = " + str(b)) print ("ret = " + str(a+b)) return def foo(a): print ("in python function foo") print ("a = " + str(a)) print ("ret = " + str(a * a)) return
3、在這個過程中有一個錯誤,缺少:inttypes.h
可以下載了放在這裡:C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
//C++程式碼: #include <iostream> #include "Python.h" using namespace std; int main(int argc, char** argv) { // 初始化Python //在使用Python系統前,必須使用Py_Initialize對其 //進行初始化。它會載入Python的內建模組並新增系統路 //徑到模組搜尋路徑中。這個函式沒有返回值,檢查系統 //是否初始化成功需要使用Py_IsInitialized。 Py_Initialize(); // 檢查初始化是否成功 if ( !Py_IsInitialized() ) { return -1; } // 添加當前路徑 //把輸入的字串作為Python程式碼直接執行,返回0 //表示成功,-1表示有錯。大多時候錯誤都是因為字串 //中有語法錯誤。 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); PyObject *pModule,*pDict,*pFunc,*pArgs;//*pName, // 載入名為CppPython的指令碼 //pName = PyString_FromString("CppPython"); char* message = "CppPython"; PyObject * bytesObject = PyByteArray_FromStringAndSize(message, strlen(message)); PyObject * buildObject = Py_BuildValue("y#", message, strlen(message)); PyObject * argsObject = PyTuple_New(1); PyTuple_SetItem(argsObject, 0, bytesObject); pModule = PyImport_Import(argsObject); if ( !pModule ) { printf("can't find CppPython.py"); getchar(); return -1; } pDict = PyModule_GetDict(pModule); if ( !pDict ) { return -1; } // 找出函式名為add的函式 pFunc = PyDict_GetItemString(pDict, "add"); //pFunc = PyObject_GetAttrString(pModule, "add"); if ( !pFunc || !PyCallable_Check(pFunc) ) { printf("can't find function [add]"); getchar(); return -1; } // 引數進棧 pArgs = PyTuple_New(2); // PyObject* Py_BuildValue(char *format, ...) // 把C++的變數轉換成一個Python物件。當需要從 // C++傳遞變數到Python時,就會使用這個函式。此函式 // 有點類似C的printf,但格式不同。常用的格式有 // s 表示字串, // i 表示整型變數, // f 表示浮點數, // O 表示一個Python物件。 PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3)); PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4)); // 呼叫Python函式 PyObject_CallObject(pFunc, pArgs); //下面這段是查詢函式foo 並執行foo pFunc = PyDict_GetItemString(pDict, "foo"); if ( !pFunc || !PyCallable_Check(pFunc) ) { printf("can't find function [foo]"); getchar(); return -1; } pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2)); // PyObject_CallObject(pFunc, pArgs); //Py_DECREF(pName); Py_DECREF(pArgs); Py_DECREF(pModule); // 關閉Python Py_Finalize(); return 0; }
64位機會出現如下錯誤:
解決方法是將編譯平臺修改為:X64