您好,登錄后才能下訂單哦!
小編給大家分享一下python生成dll的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
使用python創建生成動態鏈接庫dll
如今,隨著深度學習的發展,python已經成為了深度學習研究中第一語言。絕大部分的深度學習工具包都有python的版本,很多重要算法都有python版本的實現。為了將這些算法應用到具體工程中,這些工具包也提供了不同類型的接口。
動態鏈接庫(.dll,.so)是系統開發中一種非常重要的跨語言協作方式。把python語言寫成的算法編譯成動態庫,能夠提供給其他語言調用,這能夠在很大程度上提高算法的開發效率。
但是,雖然python可以調用其他語言生成的動態庫,python作為一種腳本語言,本身是不能直接編譯生成動態庫的。為了生成動態庫,我們借助cython,將python腳本變成c語言文件。具體過程,我們通過一個簡單的例子來解釋。
def str_add(str1,str2): return int(str1) + int(str2)
這個代碼,將兩個數字組成的字符串轉化成數字,并求和。我們把這個代碼保存成run.py備用。根據cython的語法,我們給出cython版本的函數:
cdef public str_add(str1,str2): return int(str1) + int(str2)
和前面python版本的相比,cdef替換了def,并加了public關鍵字,表示這個函數要導出。將這個代碼保存成pyx文件,比如run.pyx。
接下來,我們執行如下命令,把這個代碼變成c語言版本:
cython run.pyx
這時,目錄下面生出來run.h和run.c兩個文件。這個兩個文件通過調用python的C-API實現了run.py代碼的功能。
接下來,我們編寫動態庫的主文件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> } BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) { switch( fdwReason ) { case DLL_PROCESS_ATTACH: Py_Initialize(); PyInit_run(); #dll初始化的時候調用,這是python3的寫法,python2改成,initrun()。參見生成的run.h break; case DLL_PROCESS_DETACH: Py_Finalize(); break; } return TRUE; }
該文件定義了導出函數_str_add。在python中,所有數據都以pyobject進行存儲。這個函數通過PyUnicode_FromString,將兩個字符串變成python對象類型,并調用run.h里面的函數str_add求和,并把結果通過PyLong_AsLong函數從python對象,變成整形數字。
我們可以通過如下命令,將這個代碼編譯生成dll:
cl /LD dllmain.c run.c -IC:\python36\include C:\python36\libs\python36.lib
這里python的路徑,根據不同電腦python的安裝位置,做相應調整。
生成的dll,我們寫個簡單調用,測試一下:
#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; }
輸出結果: 579,正好等于123+456。
通過以上步驟,我們已經能夠把python代碼實現的功能,封裝成動態庫。然而,這個動態庫無法在沒有安裝python的機器上面運行。事實上,python代碼,通常需要很多依賴包才能運行。而且,每段代碼需要的依賴包是不一樣的。為了查找這些包,我們采用另外一個工具pyinstaller。具體步驟簡介如下:
(1)virtualenv envpack # 創建新的環境,python包依賴比較復雜,創建新環境可以減少最終引入的包;
(2)cd envpack # 進入目錄;
(3)#復制run.py到這個目錄,run.py運行需要的包,和最終dll需要的包是一樣的;
(4)Scripts\activate # 激活并切換到virtualenv環境;
(5)pip install pyinstaller # 安裝打包工具pyinstaller;
(6)pip install numpy # 安裝numpy等腳本需要的庫,查看你的import;
(7)pyinstaller run.py # 打包命令;
(8)Scripts\deactivate # 打包成功后,使用命令取消激活環境;
(9)需要打包的文件在envpack\dist, 包括很多.dll和.pyd文件,把這些文件和dll一起發布即可。
看完了這篇文章,相信你對python生成dll的方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。