一、Extending Python With C/C++ 主要是藉由C語言撰寫的外包函式庫(Wrapper Function Library)
來提供Python Code 和 C library之間的溝通;而所謂的外包函式即是將原本C語言的資料結構轉換成
Python的資料結構。
二、Python是由C語言為基礎所撰寫因此相關的資料結構可直接使用Python.h的檔案和相關的函式可以使用
Python31.lib (Python Ver 3.1.2)。
三、撰寫外包函式庫(Wrapper Function of Python Library)有下列三個步驟:
3-1 Initial PyModule 一 xxxx表示Module Name
PYTHON27 :
PyMODINIT_FUNC initxxxx(void) {
(void) Py_InitModule("xxxx",METHOD_LIST_NAME);
}
PYTHON31:
static PyModuleDef ModuleFunc
PyMODINIT_FUNC PyInit_xxxx() {
ModuleFunc.m_methods = METHOD_LIST_NAME;
ModuleFunc.m_name = "xxxx"
return PyModule_Create2(&ModuleFunc,PYTHON_API_VERSION)
}
3-2 Create method list of PyModule 一
ml_flags: (1) METH_VARARGS (2) METH_KEYWORDS (3) METH_NOARGS
ml_doc: PyDoc_STR("Method Descriptor");
static PyMethodDef METHOD_LIST_NAME[]{
{ml_name ,ml_meth, ml_flags , ml_doc },
………………
{NULL,NULL,0,NULL}
}
3-3 Implementation function 一 Python函式有三種不同的基本原型函式 :
3-3.1 METH_NOARGS:
static PyObject* FUNCTION_NAME(Pyobject *self){………}
3-3.2 METH_VARARGS :
static PyObject* FUNCTION_NAME (Pyobject *self,PyObject *args) {…………… }
3-3.3 METH_KEYWORDS:
static PyObject* FUNCTION_NAME (PyObject *self,
PyObject *args,
PyObject *keywods
) {…………}
對於不同的原型函式必須使用不同的轉換函式來將PyObject的參數轉換成C的資料結構:
METH_VARARGS: int PyArg_ParseTuple(PyObject *args,const char *format,……)
METH_KEYWORDS: int Parg_ParseTupleAndKeywords( PyObject *args,
PyObject *kw,
const char *format,
char *keywords[],
…… )
對於回傳結果的方式本文提供三種建立回傳結果的方式:
不回傳任何資料:值接回傳Py_None值。
固定回傳長度:直接使用PyBuildValue(char *format,……);
變動回傳長度:1. 使用PyTuple_New(), 建立Tuple PyObject。
2. 使用PyBuildValue(),將回傳值轉換成為PyObject。
3. 使用PyTuple_SetItem(),將回傳值的PyObject加入Tuple PyObject。
四、範例說明:
使用C share library(sqlite.dll)來製作Python Module;該Module包含七個外包函式
(Wrapper function),可以從Python Code來存取Sqlite database的資料檔。
範例中的相關函式說明如下:
4-1、 OpenDatabaseWithPython 一 連接Sqlite資料庫檔案並回傳開啟檔案的結果。
4-2、 ExecuteSQLWithPython 一 執行Update、Delete、Insert相關的SQL Syntax;
並回傳相關的訊息。
4-3、 QuerySQLWithPython 一 查詢的SQL Syntax並回傳相關總共的資料數、列數、行數。
4-4、 ShowRowDataWithPython 一 回傳查詢結果中特定行數的資料內容。
4-5、ShowRangeDataWithPython 一回傳查詢結果中多筆的資料內容。
4-5、 FreeResult 一 釋放查詢結果的資料。
4-6、CloseResult 一 關閉開啟的資料庫。
Download: Extending.zip
Result:
Ecplise with C:
1、設定Include file 和Libraries file(Path):
Project -> Properties -> C/C++build -> Settings -> Tools Settings ->
Include and Libraries.
2、設定輸出的檔案類型:
Project->Properties->C/C++build -> Settings-> Build Artifact ->
Artifact Type: Shared Library
Artifact extension: pyd
Eclipse with Pydev: