一、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

        ExtendingWithC.jpg

Eclipse with Pydev:

       ExtendingWithPython.jpg     

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 yunjuihuang 的頭像
    yunjuihuang

    瑞の資訊備忘錄

    yunjuihuang 發表在 痞客邦 留言(0) 人氣()