如何使用C來擴充python功能

來源:互聯網
上載者:User
如何使用C來擴充python功能[複製連結]
   
  電梯直達

1#

發表於 2008-8-4 08:50:26|只看該作者|倒序瀏覽

作者:梅勁松
本文檔和所包含程式為MIT授權

我們來實現一個簡單的加法的擴充模組!
建立一個目錄,整個目錄名中不要包含中文。在目錄下建立
add.c,內容如下:

#include <Python.h>;

static PyObject* add(PyObject *self, PyObject *args);
//一定聲明為static,把他們限制在這個檔案範圍裡。 幾乎所有的參數都是PyObject類型。 在python,每個東西都是object。

static PyObject* add(PyObject* self, PyObject* args)
{
   int x=0 ;
   int y=0;
   int z=0;
        if (! PyArg_ParseTuple(args, "i|i", &x, &y))
                return NULL;
        /*第一個參數是self,這個是python用的, 每個函數都要有。我們暫時不管。args是一個參數列表。她把所有的參數都整合成一個string。所以

        我們需要從這個string裡來解析我們的參數。PyArg_ParseTuple來完成這個任務。第一個參數是args, 就是我們要轉換的參數。第二個是格式符號。
        “s”代表是個string。 從args裡提取一個參數就寫"s", 兩個的話就寫"s|s", 如果是一個string,一個int,就寫"s|i", 和printf差不多。第三個
        參數就是提取出來的參數放置的真正位置。必須傳遞這個參數的地址。對於add, 他將提取兩個參數。分別是x和y。*/
z=x+y;
return Py_BuildValue("i", z);
    /*調用完之後我們需要返回結果。這個結果是c的type或者是我們自己定義的類型。必須把他轉換成PyObject, 讓python認識。這個用Py_BuildValue

        來完成。他是PyArg_ParseTuple的逆過程。他的第一個參數和PyArg_ParseTuple的第二個參數一樣, 是個格式化符號。第三個參數

        是我們需要轉換的參數。Py_BuildValue會把所有的返回只組裝成一個tutple給python。*/
}

static PyMethodDef addMethods[] =
{
   {"add",  add, METH_VARARGS, "Execute a shell command."},
   {NULL, NULL, 0, NULL}
};
/*這個是一個c的結構。他來完成一個映射。 我們需要把我們擴充的函數都映射到這個表裡。表的第一個欄位是python真正認識的。是python
裡的方法名字。 第二個欄位是python裡的這個方法名字的具體實現的函數名。 在python裡調用add, 真正執行的是用c寫的add函數。
第三個欄位是METH_VARARGS, 他告訴python,add是調用c函數來實現的。第四個欄位是這個函數的說明。如果你在python裡來help這個函數,
將顯示這個說明。相當於在python裡的函數的文檔說明。*/

PyMODINIT_FUNC initadd()
{
       Py_InitModule("add", addMethods);
}
/*注意,這個函數的名字不能改動。 必須是init+模組名字。 我們的模組名字是add。所以這個函數是initadd()。
這樣python在匯入add 的模組時候,才會找到這個函數,並調用。這個函數調用Py_InitModule來將模組名字和映射表結合在一起。
他表示,add這個模組使用addMethods這個映射表。python應該這樣匯入我們的module的.*/

然後建立setup.py這個檔案,內容如下:

#! /usr/bin/python

from distutils.core import setup, Extension

module1 = Extension('add', sources = ['add.c'])

setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1])

在msdos下進入這個目錄,輸入命令setup.py build。
如果你能編譯成功,到你所在目錄的build\lib.win32-2.3下會發現add.pyd檔案,將檔案複製到你所需要的地方,啟動python,然後:

D:\c>;python
Python 2.3.3 (#51, Dec 18 2003, 20:22:39) [MSC v.1200 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>;>;>; import add
>;>;>; print dir(add)
['__doc__', '__file__', '__name__', 'add']
>;>;>; add.add(1,2)
3
>;>;>;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.