一、Embedded Python With C/C++主要的目的是讓C/C++所撰寫的程式可以透過特定的方式(Method)
來運用Python相關的Module,使得Python與C/C++在整合開發上更加的便利。
二、Python是由C/C++為基礎所撰寫因此相關的資料結構可以使用Python.h的檔案和相關的函式可以使用
Python31.lib (Python Ver 3.1.2)
三、在C/C++程式中使用Python相關的Module有下列五個步驟:
3-1 初始化Python的直譯器: Py_Initialize()
3-2 載入所需的Python Module:
MODULE_OBJECT = PyImport_importModule("Module Name");
3-3 查詢和執行所需的Python Method or Attribue:
取得Attribute名稱:
ATTRIBUTE_OBJECT = PyObject_GetAttrString(MODULE_OBJECT,"ATTRIBUTE_NAME");
當回傳的ATTRIBUTE_OBJECT為方法(Method)而不是屬性值的話,則可以使用下列的二種函式來執行
取得的ATTRIBUTE_OBJECT,下列兩種執行方法(Method)的不同於傳遞的參數類型的不同:
RUN_RESULT = PyObject_CallFunction (ATTRIBUTE_OBJECT,
"PARAM_TYPE",PRARM_VALUE);
PRARM_VALUE:C的變數或常數
PRARM_TYPE:參數的類型符號
相關設定的方式可以參考Py_BuildValue的使用方法。
or
RUN_RESULT = PyObject_CallObject(ATTRIBUTE_OBJECT,PARAM_OBJECT);
PARAM_OBJECT:為一個Tuple Object物件
Python也提供另一種直接執行Mehtod的方法:
RUN_RESULT = PyObject_CallMethod(MODULE_OBJECT,
"METHOD_NAME", "PARAM_TYPE",PARAM_VALUE);
PRARM_VALUE:C的變數或常數
PRARM_TYPE:參數的類型符號
相關設定的方式可以參考Py_BuildValue的使用方法。
3-4 將取得的PyObject物件使用下列的函式轉換成C/C++的資料結構:
3-4.1 PyTuple_Check:
判斷取得的PyObject是否為一PyTuple Object或 subtype of the tupel type
3-4.2 PyTuple_Size: 取得回傳的Tuple Object中包含多少的資料內容。
3-4.3 PyTuple_GetItem: 取得Tuple Object 中指定的資料內容
3-3.4 PyXXX_Check: 檢查PyObject的物件內容為何種資料型別。
1. PyFloat_Check - 判斷是否為float or double的資料型別。
2. PyInt_Check - 判斷是否為整數資料型別。(Python 2.7)
3. PyLong_Check - 判斷是否為長整數資料型別。(Python 3.1)
4. PyString_Check - 判斷是否為字串資料型別。(Python 2.7)
3-3.5 PyArg_Parse:將PyObject依照不同的型別轉換成相對應的C/C++資料型別。
3-5 關閉Python的直譯器: Py_Finalize()
四、範例說明:
由於目前pysqlite已經被整合為Python的標準函式庫,因此本範例藉由pysqlite來讀取
Sqlite的資料庫檔。範例的相關函式說明如下:
4-1、ShowPythonVersion 一 顯示目前使用的Python的版本和 Python API的版本
4-2、ShowSqliteVersion 一 顯示目前使用的pysqlite的版本
4-3、ConnectToDatabase 一 開啟指定的Sqlite資料庫檔案
4-4、CreateCursor 一 建立cursor物件。
4-5、ExecuteSQLSyntax 一 使用cursor物件來執行SQL的語法並回傳查詢的結果
4-6、PrintQueryData 一 顯示查詢的資料的內容
Download: EmbeddedWithC.Zip
Result:
設定Include file和Libraries File(Path):
Project -> Properties -> C/C++ build-> Tools Settings ->
Include and Libraries.
留言列表