亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Qt使用C/C++擴展Python內置模塊

系統 1856 0

之前和大家介紹過在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測試文件放到同一目錄下,即可運行測試。如圖:

Qt使用C/C++擴展Python內置模塊_第1張圖片

如需要完成工程可在公眾號后臺留言。

歡迎交流:

Qt使用C/C++擴展Python內置模塊_第2張圖片


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久毛片蜜月 | 国产不卡网 | 日韩三级久久 | 四虎影视在线观看2413 | a亚洲视频| 久久综合九色综合网站 | 国产精品亚洲第一区广西莫菁 | 国产高清在线精品免费 | 99热久久这里只精品国产9 | 国产美女色视频 | 亚洲精品色综合久久久 | 在线不卡一区二区 | 国产精品永久在线 | 久久精品动漫99精品动漫 | 国产成人精品久久综合 | 久久精品国语 | 99久久精品免费看国产高清 | 国产精品福利视频主播真会玩 | 久久专区 | 成年女人永久免费观看片 | 女生毛片| 亚洲加勒比久久88色综合一区 | 毛片啪啪视频 | 亚洲国产精品一区二区三区 | 日韩精品欧美亚洲高清有无 | 无遮挡又黄又爽又色的视频免费 | 日本一级毛片免费看 | 老色鬼a∨在线视频在线观看 | 99精品福利视频 | 91久久国产视频 | 精品一区二区视频在线观看 | 国产精品99r8在线观看 | 五月婷视频 | 亚洲精品免费在线 | 亚洲香蕉久久一区二区三区四区 | 不一样的天空在线高清观看 | 午夜影院在线视频 | 福利午夜国产网站在线不卡 | 国产欧美日韩在线播放 | 四虎4444hu4影视最新地址 | 久久亚洲国产精品五月天婷 |