日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python利用写模块_使用C++编写python扩展模块

發布時間:2023/12/10 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python利用写模块_使用C++编写python扩展模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

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

基本流程

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

言歸正傳,感覺前面說得太多了,實際上很簡單,因此我決定少說多做。一個C++的Python擴展模塊至少應該有導出函數,方法列表和初始化函數三個部分。我們用VS2005這個強大的工具開工!一般來說,你應該建一個Dll工程(至于使用exe來擴展Python可以不可以,暫時還沒研究過)。下面按部就班的說明(關鍵說明在注釋部分)。

一、初始化函數

//-------------------------------------------------------------------------

//函數: initPyExt

//功能:初始化函數

//返回值:PyMODINIT_FUNC

//附注:注意,這個函數的名字不能改動。必須是init+模塊名字,

//我們的模塊名字是PyExt,所以函數名是initPyExt。Python在導入

//我們的PyExt模塊時,會找到這個函數,并調用。這個函數實現的

//功能很簡單,通過調用Py_InitModule將模塊名字和映射表結合起

//來,它的意思是說PyExt這個模塊使用PyExtMethods這個映射表。

//-------------------------------------------------------------------------

PyMODINIT_FUNCinitPyExt()

{

Py_InitModule("PyExt",PyExtMethods);

}

二、方法列表

/*

方法列表,這個是一個C結構數組。把需要擴展的函數都映射到這個表里。

那么Python就知道你的這個擴展模塊支持一些什么方法了。表的第一個字

段是方法名字,也是通過Python來調用時的名字。第二個字段是導出函數,

是真正調用的函數,也是C\C++實現的函數。第三個參數是指明Python向

C\C++函數傳遞參數的形式??蛇x的兩種方式是METH_VARARGS和

METH_KEYWORDS,其中METH_VARARGS是參數傳遞的標準形式,它通

過Python的元組在Python解釋器和C函數之間傳遞參數,若采用

METH_KEYWORD方式,則Python解釋器和C函數之間將通過Python的字典

類型在兩者之間進行參數傳遞。第四個字段是這個函數的說明。如果你在

python里來help這個函數,將顯示這個說明。相當于在python里的函數的文檔說明。

*/

staticPyMethodDefPyExtMethods[]=

{

{"Add",?Add,METH_VARARGS,"Addtwo ?number - edit by magictong."},

{"ExecSystem",ExecSystem,METH_VARARGS,"Execute ?a shell command - edit bymagictong." },

{NULL,NULL, 0,NULL}

};

三、導出函數

//-------------------------------------------------------------------------

//函數: Add

//功能:這是一個加法函數

//返回值:PyObject*

//參數: PyObject*self這個參數我們暫時不用理會

//參數: PyObject*args是一個參數列表,我們需要從它解析出參數

//附注:

//所有的導出函數都具有相同的原型:

// PyObject*method(PyObject* self, PyObject* args);

//PyArg_ParseTuple來完成解析參數任務。它的第一個參數是args,

//就是我們要轉換的參數。第二個是格式符號。"s"代表是個string。

//從args里提取一個參數就寫"s",兩個的話就寫"s|s",如果是一個

// string,一個int,就寫"s|i",有點和printf類似哦。第三個參數就是

//提取出來的參數放置的真正位置。必須傳遞這個參數的地址。

//-------------------------------------------------------------------------

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);

/*

調用完之后我們需要返回結果。這個結果是c的type或者是我們自己定義的類型。

必須把他轉換成PyObject,讓python認識。這個用Py_BuildValue來完成。他

是PyArg_ParseTuple的逆過程。他的第一個參數和PyArg_ParseTuple的第二個

參數一樣,是個格式化符號。第三個參數是我們需要轉換的參數。Py_BuildValue

會把所有的返回只組裝成一個tutple給python。

如果對應的C函數沒有返回值(即返回值類型為void),則應返回一個全局的None

對象(Py_None),并將其引用計數增,如下所示:

Py_INCREF(Py_None);

returnPy_None;

*/

}

四、再加點功能

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);

}

編譯

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

使用

可能的問題

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

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

參考文獻

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的python利用写模块_使用C++编写python扩展模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。