欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用C++擴(kuò)展Python的功能詳解

 更新時(shí)間:2018年01月12日 10:04:02   作者:mingz2013  
這篇文章主要介紹了使用C++擴(kuò)展Python的功能詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文主要研究的是使用C++擴(kuò)展Python的功能的相關(guān)問(wèn)題,具體如下。

環(huán)境

VS2005Python2.5.4Windows7(32位)

簡(jiǎn)介

長(zhǎng)話短說(shuō),這里說(shuō)的擴(kuò)展Python功能與直接用其它語(yǔ)言寫(xiě)一個(gè)動(dòng)態(tài)鏈接庫(kù),然后讓Python來(lái)調(diào)用有點(diǎn)不一樣(雖然本質(zhì)是一樣的)。而是指使用Python本身提供的API,使用C++來(lái)對(duì)Python進(jìn)行功能性擴(kuò)展,可以這樣理解,使用更高效的語(yǔ)言實(shí)現(xiàn)一些算法計(jì)算等等需要更高執(zhí)行效率的核心(或者需要與系統(tǒng)進(jìn)行密切交互的)模塊,然后讓Python像調(diào)用內(nèi)建標(biāo)準(zhǔn)庫(kù)的方式來(lái)調(diào)用這些模塊,聽(tīng)起來(lái)是不是很誘人?!在軟件技術(shù)高速發(fā)展的今天,借助幾種計(jì)算機(jī)語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)系統(tǒng)的例子數(shù)不勝數(shù),目的不外乎就是性能和便利的平衡。譬如本文要討論的使用C++來(lái)擴(kuò)展Python就是Python和C++的一種巧妙的有機(jī)結(jié)合,好處不言而喻,既可以獲得和C++相似的執(zhí)行性能,又可以利用Python的開(kāi)發(fā)靈活性。由于Python本身是使用C實(shí)現(xiàn)的,二者結(jié)合起來(lái)還是比較容易的。

基本流程

本文不適合這樣的讀者——對(duì)Python完全不了解或者對(duì)C\C++完全不了解,道理你們懂的。另外就是Python里面有6種基本數(shù)據(jù)類型。你需要了解如何在C和Python之間對(duì)這些類型進(jìn)行轉(zhuǎn)化(這不在本文討論范圍,可以參考[1])。

言歸正傳,感覺(jué)前面說(shuō)得太多了,實(shí)際上很簡(jiǎn)單,因此我決定少說(shuō)多做。一個(gè)C++的Python擴(kuò)展模塊至少應(yīng)該有導(dǎo)出函數(shù),方法列表和初始化函數(shù)三個(gè)部分。我們用VS2005這個(gè)強(qiáng)大的工具開(kāi)工!一般來(lái)說(shuō),你應(yīng)該建一個(gè)Dll工程(至于使用exe來(lái)擴(kuò)展Python可以不可以,暫時(shí)還沒(méi)研究過(guò))。下面按部就班的說(shuō)明(關(guān)鍵說(shuō)明在注釋部分)。

一、初始化函數(shù)

//-------------------------------------------------------------------------
// 函數(shù)    : initPyExt
// 功能    : 初始化函數(shù)
// 返回值   :PyMODINIT_FUNC
// 附注    : 注意,這個(gè)函數(shù)的名字不能改動(dòng)。必須是init+模塊名字,
// 我們的模塊名字是PyExt,所以函數(shù)名是initPyExt。Python在導(dǎo)入
// 我們的PyExt模塊時(shí),會(huì)找到這個(gè)函數(shù),并調(diào)用。這個(gè)函數(shù)實(shí)現(xiàn)的
// 功能很簡(jiǎn)單,通過(guò)調(diào)用Py_InitModule將模塊名字和映射表結(jié)合起
// 來(lái),它的意思是說(shuō)PyExt這個(gè)模塊使用PyExtMethods這個(gè)映射表。
//-------------------------------------------------------------------------
PyMODINIT_FUNCinitPyExt()
{
    Py_InitModule("PyExt",PyExtMethods);
}

二、方法列表

/*
   方法列表,這個(gè)是一個(gè)C結(jié)構(gòu)數(shù)組。把需要擴(kuò)展的函數(shù)都映射到這個(gè)表里。
   那么Python就知道你的這個(gè)擴(kuò)展模塊支持一些什么方法了。表的第一個(gè)字
   段是方法名字,也是通過(guò)Python來(lái)調(diào)用時(shí)的名字。第二個(gè)字段是導(dǎo)出函數(shù),
   是真正調(diào)用的函數(shù),也是C\C++實(shí)現(xiàn)的函數(shù)。第三個(gè)參數(shù)是指明Python向
   C\C++函數(shù)傳遞參數(shù)的形式??蛇x的兩種方式是METH_VARARGS和
   METH_KEYWORDS,其中METH_VARARGS是參數(shù)傳遞的標(biāo)準(zhǔn)形式,它通
   過(guò)Python的元組在Python解釋器和C函數(shù)之間傳遞參數(shù),若采用
   METH_KEYWORD方式,則Python解釋器和C函數(shù)之間將通過(guò)Python的字典
   類型在兩者之間進(jìn)行參數(shù)傳遞。第四個(gè)字段是這個(gè)函數(shù)的說(shuō)明。如果你在
   python里來(lái)help這個(gè)函數(shù),將顯示這個(gè)說(shuō)明。相當(dāng)于在python里的函數(shù)的文檔說(shuō)明。
*/
staticPyMethodDefPyExtMethods[]=
{
    {"Add", Add,METH_VARARGS,"Addtwo number - edit by magictong."},
    {"ExecSystem",ExecSystem,METH_VARARGS,"Execute a shell command - edit bymagictong." },
    {NULL,NULL, 0,NULL}
};

三、導(dǎo)出函數(shù)

//-------------------------------------------------------------------------
// 函數(shù)    : Add
// 功能    : 這是一個(gè)加法函數(shù)
// 返回值   :PyObject*
// 參數(shù)    : PyObject*self 這個(gè)參數(shù)我們暫時(shí)不用理會(huì)
// 參數(shù)    : PyObject*args 是一個(gè)參數(shù)列表,我們需要從它解析出參數(shù)
// 附注    :
// 所有的導(dǎo)出函數(shù)都具有相同的原型:
// PyObject*method(PyObject* self, PyObject* args);
//PyArg_ParseTuple來(lái)完成解析參數(shù)任務(wù)。它的第一個(gè)參數(shù)是args,
// 就是我們要轉(zhuǎn)換的參數(shù)。第二個(gè)是格式符號(hào)。"s"代表是個(gè)string。
// 從args里提取一個(gè)參數(shù)就寫(xiě)"s",兩個(gè)的話就寫(xiě)"s|s",如果是一個(gè)
// string,一個(gè)int,就寫(xiě)"s|i",有點(diǎn)和printf類似哦。第三個(gè)參數(shù)就是
// 提取出來(lái)的參數(shù)放置的真正位置。必須傳遞這個(gè)參數(shù)的地址。
//-------------------------------------------------------------------------
staticPyObject*Add(PyObject*self,PyObject*args)
{
    intx = 0 ;
    inty = 0;
    intz = 0;
    if(!PyArg_ParseTuple(args,"i|i", &x, &y))
       returnNULL;
    z=x +y;
    returnPy_BuildValue("i",z);
    /*
      調(diào)用完之后我們需要返回結(jié)果。這個(gè)結(jié)果是c的type或者是我們自己定義的類型。
      必須把他轉(zhuǎn)換成PyObject,讓python認(rèn)識(shí)。這個(gè)用Py_BuildValue來(lái)完成。他
      是PyArg_ParseTuple的逆過(guò)程。他的第一個(gè)參數(shù)和PyArg_ParseTuple的第二個(gè)
      參數(shù)一樣,是個(gè)格式化符號(hào)。第三個(gè)參數(shù)是我們需要轉(zhuǎn)換的參數(shù)。Py_BuildValue
      會(huì)把所有的返回只組裝成一個(gè)tutple給python。
 
      如果對(duì)應(yīng)的C函數(shù)沒(méi)有返回值(即返回值類型為void),則應(yīng)返回一個(gè)全局的None
      對(duì)象(Py_None),并將其引用計(jì)數(shù)增,如下所示:
      Py_INCREF(Py_None);
      returnPy_None;
   */
}

四、再加點(diǎn)功能

intcmd(constchar* arg)
{
    returnsystem(arg);
}
 
staticPyObject*ExecSystem(PyObject*self,PyObject*args)
{
    constchar*command;
    if(!PyArg_ParseTuple(args,"s", &command))
       returnNULL;
    intn =cmd(command);
    returnPy_BuildValue("i",n);
}

編譯

開(kāi)編,編譯出來(lái)的PyExt.dll文件改名為PyExt.pyd放入Python的C:\Python25\DLLs目錄就可以全局使用了,如果你只想某個(gè)Python的工程,放在工程的相對(duì)路徑下面就可以了。

使用

可能的問(wèn)題

里面的這些PyMODINIT_FUNC,與Python相關(guān)的宏和定義在哪里呢?定義下#include<Python.h>就可以了,但是定義了之后提示Python.h找不到還是編譯不過(guò)怎么辦?這說(shuō)明你沒(méi)有安裝Python或者安裝了但是沒(méi)有把頭文件路徑引入Path環(huán)境變量,或者你把Python的include目錄加入工程的附加包含目錄(Additional IncludeDirectories),一般是C:\Python25\include這個(gè)目錄,其中C:\Python25是Python的安裝目錄,按你機(jī)器的實(shí)際情況配置)。

如果提示:Error 1 fatal error LNK1104:cannot open file 'python25_d.lib' 類似這樣的錯(cuò)誤,一般可能是沒(méi)有安裝Python的開(kāi)發(fā)版本,沒(méi)關(guān)系,你使用Release編譯一下,如果還不行,就把C:\Python25\libs目錄加入工程的附加庫(kù)目錄(Additional LibraryDirectories)。

總結(jié)

以上就是本文關(guān)于使用C++擴(kuò)展Python的功能詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • python?DataFrame的shift()方法的使用

    python?DataFrame的shift()方法的使用

    在python數(shù)據(jù)分析中,可以使用shift()方法對(duì)DataFrame對(duì)象的數(shù)據(jù)進(jìn)行位置的前滯、后滯移動(dòng),本文主要介紹了python?DataFrame的shift()方法的使用,感興趣的可以了解一下
    2022-03-03
  • Python?GUI利用tkinter皮膚ttkbootstrap實(shí)現(xiàn)好看的窗口

    Python?GUI利用tkinter皮膚ttkbootstrap實(shí)現(xiàn)好看的窗口

    這篇文章主要介紹了Python?GUI利用tkinter皮膚ttkbootstrap實(shí)現(xiàn)好看的窗口,文章基于python的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • GELU激活函數(shù)算法

    GELU激活函數(shù)算法

    這篇文章主要為大家介紹了GELU激活函數(shù)算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python實(shí)現(xiàn)簡(jiǎn)單遺傳算法(SGA)

    Python實(shí)現(xiàn)簡(jiǎn)單遺傳算法(SGA)

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單遺傳算法SGA,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作

    Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作

    這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe修改和刪除及查詢操作的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • python實(shí)現(xiàn)備份目錄的方法

    python實(shí)現(xiàn)備份目錄的方法

    這篇文章主要介紹了python實(shí)現(xiàn)備份目錄的方法,實(shí)例總結(jié)了Python實(shí)現(xiàn)備份目錄的三種常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 淺談python元素如何去重,去重后如何保持原來(lái)元素的順序不變

    淺談python元素如何去重,去重后如何保持原來(lái)元素的順序不變

    這篇文章主要介紹了淺談python元素如何去重,去重后如何保持原來(lái)元素的順序不變?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • python UIAutomator2使用超詳細(xì)教程

    python UIAutomator2使用超詳細(xì)教程

    這篇文章主要介紹了python UIAutomator2使用超詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • python通過(guò)opencv實(shí)現(xiàn)圖片裁剪原理解析

    python通過(guò)opencv實(shí)現(xiàn)圖片裁剪原理解析

    這篇文章主要介紹了python通過(guò)opencv實(shí)現(xiàn)圖片裁剪原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python requests設(shè)置代理的方法步驟

    Python requests設(shè)置代理的方法步驟

    這篇文章主要介紹了Python requests設(shè)置代理的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論