之前和大家介紹過在C/C++中嵌入 Python ,本次和大家分享下使用 C/C++ 擴展 Python 內置模塊的方法。
被擴展出來的新模塊可以做兩件無法直接在Python中完成的事情:一可以實現新的內置對象類型,二則可以調用 C 庫函數和一些其他的系統調用。
?
使用平臺:ubuntu14.04、 python3.5 、 Qt 5.5.1
?
下面借助Qt創建一個叫 libpy3extend 的 Python 內置模塊,它可以做一個簡單的加法操作,還可以返回一個自定義的數據類型。調用形式如下:
import libpy3extend
libpy3extend.extend_add(1,99)
ibpy3extend.extend_str()
?
先使用Qt建一個生成庫的工程,之后按照步驟進行操作即可。
?
1. extend.cpp文件首先是包含所用到的頭文件:
?
#include
#include
?
2.?向extend.cpp模塊文件中添加 C 函數,該函數在執行 libpy3extend.extend_add(1,99) ?? 時被調用。 C 函數總是有兩個參數,通常命名為 self 和 args 。
static PyObject *extend_add(PyObject *self, PyObject *args)
{
(void)(self);
PyObject *pArgs = NULL;
int result = 0;
int arg1 = 0;
int arg2 = 0;
if (!PyArg_ParseTuple(args, "ii",&arg1,&arg2))
{
std::cerr << "parameters error" << std::endl;
Py_INCREF(Py_None);
pArgs = Py_None;
}
else
{
result = arg1 + arg2;
pArgs = Py_BuildValue("i", result);
}
return pArgs;
}
args參數是一個元組對象,使用 PyArg_ParseTuple() 函數來解析,解析規則可參考 python 文檔
https://docs.python.org/3/c-api/arg.html#arg-parsing
3. 創建模塊方法表并在表中列出函數名稱和地址。
static PyMethodDef extendMethods[] = {
//extend add
{"extend_add", extend_add, METH_VARARGS, NULL},
{"extend_str", extend_str, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
METH_VARARGS 表示該函數希望參數傳遞為元組數據以使用 PyArg_ParseTuple() 函數來解析。
?
?
4.?在模塊定義結構中引用方法表
static struct PyModuleDef extendMoudle =
{
PyModuleDef_HEAD_INIT,
"py3extend", /* name of module */
NULL, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
extendMethods,
NULL,
NULL,
NULL,
NULL
};
5. 將剛才定義的結構傳遞給模塊初始化函數中的解釋器。
注意:必須命名初始化函數 PyInit_name() ,其中 name 是模塊的名稱 。我這里模塊 ? 名稱是 py3extend ,但是由于生成的是庫文件,會自動加上 lib 前綴,所以這 ?里模塊名稱是 lib py3extend ,不是該名稱會報
ImportError: dynamic module does not define module export function? ????(PyInit_libpy3extend)
這個錯誤。
PyMODINIT_FUNC PyInit_libpy3extend(void)
{
//to use thread in extend moudle
// if (!PyEval_ThreadsInitialized()) {
// PyEval_InitThreads();
// }
return PyModule_Create(&extendMoudle);
}
到這里就可以借助Qt生成庫文件了,如果不知道怎么使用 Qt 生成庫文件可以參考Qt創建共享庫該文章。
接下來是如何使用庫文件。將庫文件與python測試文件放到同一目錄下,即可運行測試。如圖:
如需要完成工程可在公眾號后臺留言。
歡迎交流:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
