如何使用C来扩展python功能。
生活随笔
收集整理的這篇文章主要介紹了
如何使用C来扩展python功能。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文檔和所包含程序為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
>;>;>; 復制代碼
我們來實現一個簡單的加法的擴展模塊!
建立一個目錄,整個目錄名中不要包含中文。在目錄下建立
add.c,內容如下:
然后建立setup.py這個文件,內容如下:
在msdos下進入這個目錄,輸入命令setup.py build。
如果你能編譯成功,到你所在目錄的build\lib.win32-2.3下會發現add.pyd文件,將文件復制到你所需要的地方,啟動python,然后:
總結
以上是生活随笔為你收集整理的如何使用C来扩展python功能。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C运行库
- 下一篇: ggplot2绘图点的形状不够用怎么办?