Python是一門(mén)功能強大的腳本語(yǔ)言,它的強大不僅表現在功能上,還表現在其擴展性上。她提供大量的API以方便程序員利用C/C++對Python進(jìn)行擴展。因為執行速度慢幾乎是所有腳本語(yǔ)言的通病,Python通過(guò)一個(gè)巧妙的方法,使得程序員可以利用C/C++編寫(xiě)執行速度比較慢的模塊,從而獲得與C/C++差不多的執行性能。本文給出一個(gè)例子說(shuō)明怎樣用C來(lái)擴展Python。
1、在C和Python之間進(jìn)行數據類(lèi)型轉化
Python有六種基本數據類(lèi)型:整型,浮點(diǎn)型,字符串,列表,字典,元組。在進(jìn)行介紹之前,我們先了解一下怎么在C和Python之間轉化幾種常用的數據類(lèi)型。
整型轉化
PyObject *pInt = Py_BuildValue(\"i\", 2007);
浮點(diǎn)型轉化
PyObject *pFloat = Py_BuildValue(\"f\", 3.14);
字符串轉化
PyObject *pString = Py_BuildValue(\"s\", \"I am Yan.Dingcheng\");
2、用C擴展Python
在了解了常用的數據類(lèi)型轉化以后,我們就可以編寫(xiě)一些C程序來(lái)擴展Python了。比如下面有個(gè)C文件exam.c,我們要在Python里調用它里面的函數。
| int power(int a) { return a * a; } int add_int(int a, int b) { return a + b; } void my_print(const char *s) { if (!s) { return; } printf(\"%s \\n\", s); } void whoami(void) { printf(\"I am plusboy. \\n\"); } |
那么我們首先要將其實(shí)現為Python的一個(gè)模塊,這需要編寫(xiě)一個(gè)封裝接口,我們把它保存為wrap_exam.c,示例如下:
| #include <Python.h> PyObject *wrap_power(PyObject *self, PyObject *args) { int result, n;
/*這里args包含Python解釋器要傳遞給C函數的參數列表,
\"i:power\"表示要給power函數傳遞一個(gè)整數, n保存從Python腳本里傳過(guò)來(lái)的參數*/ if (!PyArg_ParseTuple(args, \"i:power\", &n)) { return NULL; } result = power(n); return Py_BuildValue(\"i\", result); } PyObject *wrap_add_int(PyObject *self, PyObject *args) { int result, a, b; /*這里args包含Python解釋器要傳遞給C函數的參數列表, \"ii:power\"表示要給add_int函數傳遞兩個(gè)整數, a, b保存從Python腳本里傳過(guò)來(lái)的參數*/ if (!PyArg_ParseTuple(args, \"ii:add_int\", &a, &b)) { return NULL; } result = add_int(a, b); return Py_BuildValue(\"i\", result); } |
聯(lián)系客服