国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

使用python創(chuàng)建生成動(dòng)態(tài)鏈接庫(kù)dll的方法

瀏覽:6日期:2022-07-26 09:45:48

如今,隨著深度學(xué)習(xí)的發(fā)展,python已經(jīng)成為了深度學(xué)習(xí)研究中第一語(yǔ)言。絕大部分的深度學(xué)習(xí)工具包都有python的版本,很多重要算法都有python版本的實(shí)現(xiàn)。為了將這些算法應(yīng)用到具體工程中,這些工具包也提供了不同類型的接口。

動(dòng)態(tài)鏈接庫(kù)(.dll,.so)是系統(tǒng)開發(fā)中一種非常重要的跨語(yǔ)言協(xié)作方式。把python語(yǔ)言寫成的算法編譯成動(dòng)態(tài)庫(kù),能夠提供給其他語(yǔ)言調(diào)用,這能夠在很大程度上提高算法的開發(fā)效率。

但是,雖然python可以調(diào)用其他語(yǔ)言生成的動(dòng)態(tài)庫(kù),python作為一種腳本語(yǔ)言,本身是不能直接編譯生成動(dòng)態(tài)庫(kù)的。為了生成動(dòng)態(tài)庫(kù),我們借助cython,將python腳本變成c語(yǔ)言文件。具體過(guò)程,我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)解釋。

def str_add(str1,str2): return int(str1) + int(str2)

這個(gè)代碼,將兩個(gè)數(shù)字組成的字符串轉(zhuǎn)化成數(shù)字,并求和。我們把這個(gè)代碼保存成run.py備用。根據(jù)cython的語(yǔ)法,我們給出cython版本的函數(shù):

cdef public str_add(str1,str2): return int(str1) + int(str2)

和前面python版本的相比,cdef替換了def,并加了public關(guān)鍵字,表示這個(gè)函數(shù)要導(dǎo)出。將這個(gè)代碼保存成pyx文件,比如run.pyx。

接下來(lái),我們執(zhí)行如下命令,把這個(gè)代碼變成c語(yǔ)言版本:

cython run.pyx

這時(shí),目錄下面生出來(lái)run.h和run.c兩個(gè)文件。這個(gè)兩個(gè)文件通過(guò)調(diào)用python的C-API實(shí)現(xiàn)了run.py代碼的功能。

接下來(lái),我們編寫動(dòng)態(tài)庫(kù)的主文件dllmain.c:

#include <Python.h>#include <Windows.h>#include 'run.h' extern __declspec(dllexport) int __stdcall _str_add(const char * a, const char * b) { return PyLong_AsLong(str_add(PyUnicode_FromString(a),PyUnicode_FromString(b)));<br data-filtered='filtered'>} BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) { switch( fdwReason ) { case DLL_PROCESS_ATTACH: Py_Initialize(); PyInit_run(); #dll初始化的時(shí)候調(diào)用,這是python3的寫法,python2改成,initrun()。參見(jiàn)生成的run.h break; case DLL_PROCESS_DETACH: Py_Finalize(); break; } return TRUE;}

該文件定義了導(dǎo)出函數(shù)_str_add。在python中,所有數(shù)據(jù)都以pyobject進(jìn)行存儲(chǔ)。這個(gè)函數(shù)通過(guò)PyUnicode_FromString,將兩個(gè)字符串變成python對(duì)象類型,并調(diào)用run.h里面的函數(shù)str_add求和,并把結(jié)果通過(guò)PyLong_AsLong函數(shù)從python對(duì)象,變成整形數(shù)字。

我們可以通過(guò)如下命令,將這個(gè)代碼編譯生成dll:

cl /LD dllmain.c run.c -IC:python36include C:python36libspython36.lib

這里python的路徑,根據(jù)不同電腦python的安裝位置,做相應(yīng)調(diào)整。

生成的dll,我們寫個(gè)簡(jiǎn)單調(diào)用,測(cè)試一下:

#include 'stdio.h'#include 'stdlib.h'extern __declspec(dllexport) int __stdcall _str_add(const char * a, const char * b); #pragma comment(lib,'dllmain.lib') int main(){ printf('%d n', _str_add('123','456')); return 0;}

輸出結(jié)果: 579,正好等于123+456。

通過(guò)以上步驟,我們已經(jīng)能夠把python代碼實(shí)現(xiàn)的功能,封裝成動(dòng)態(tài)庫(kù)。然而,這個(gè)動(dòng)態(tài)庫(kù)無(wú)法在沒(méi)有安裝python的機(jī)器上面運(yùn)行。事實(shí)上,python代碼,通常需要很多依賴包才能運(yùn)行。而且,每段代碼需要的依賴包是不一樣的。為了查找這些包,我們采用另外一個(gè)工具pyinstaller。具體步驟簡(jiǎn)介如下:

virtualenv envpack # 創(chuàng)建新的環(huán)境,python包依賴比較復(fù)雜,創(chuàng)建新環(huán)境可以減少最終引入的包c(diǎn)d envpack # 進(jìn)入目錄#復(fù)制run.py到這個(gè)目錄,run.py運(yùn)行需要的包,和最終dll需要的包是一樣的Scriptsactivate # 激活并切換到virtualenv環(huán)境pip install pyinstaller # 安裝打包工具pyinstallerpip install numpy # 安裝numpy等腳本需要的庫(kù),查看你的importpyinstaller run.py # 打包命令Scriptsdeactivate # 打包成功后,使用命令取消激活環(huán)境需要打包的文件在envpackdist, 包括很多.dll和.pyd文件,把這些文件和dll一起發(fā)布即可。

總結(jié)

到此這篇關(guān)于使用python創(chuàng)建生成動(dòng)態(tài)鏈接庫(kù)dll的方法的文章就介紹到這了,更多相關(guān)python動(dòng)態(tài)鏈接庫(kù)dll內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 在线精品免费观看综合 | 亚洲欧美日韩在线观看二区 | 国产三a级日本三级日产三级 | 亚洲精品手机在线 | 国产一区二区在线观看视频 | 欧美人禽杂交狂配毛片 | 国产精品玖玖 | 欧美成人aaaa免费高清 | 中文字幕在线观看国产 | 人碰人碰人成人免费视频 | 久久久久亚洲精品影视 | 国产孕妇孕交视频在线观看 | 亚洲国产精品自在现线让你爽 | 久久精品午夜视频 | 米奇久久| 91资源在线播放 | 日本一本色道 | 亚洲一区在线观看视频 | 日本人的色道免费网站 | 亚洲中文字幕特级毛片 | 欧美三级黄 | 九九综合 | 久久久久国产视频 | 亚洲视频三级 | 国产精品视频久久久 | 一本色道久久综合亚洲精品高清 | 欧美成人综合在线 | 美女黄色免费在线观看 | 日本特一级毛片免费视频 | 青青草原色 | 国产成人亚洲欧美三区综合 | 在线99| 日本精品久久久久久久久免费 | 精品亚洲一区二区三区 | 久久久久欧美国产精品 | 国产精品自拍合集 | 国产精品1区2区3区在线播放 | 欧美日韩国产亚洲综合不卡 | 国产亚洲精品自在线观看 | 99精品视频在线观看免费 | 色本道 |