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

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

 更新時間:2020年05月09日 14:15:53   作者:xueliangliu  
這篇文章主要介紹了使用python創(chuàng)建生成動態(tài)鏈接庫dll的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

但是,雖然python可以調用其他語言生成的動態(tài)庫,python作為一種腳本語言,本身是不能直接編譯生成動態(tài)庫的。為了生成動態(tài)庫,我們借助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。

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

cython run.pyx

這時,目錄下面生出來run.h和run.c兩個文件。這個兩個文件通過調用python的C-API實現(xiàn)了run.py代碼的功能。

接下來,我們編寫動態(tài)庫的主文件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初始化的時候調用,這是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代碼實現(xiàn)的功能,封裝成動態(tài)庫。然而,這個動態(tài)庫無法在沒有安裝python的機器上面運行。事實上,python代碼,通常需要很多依賴包才能運行。而且,每段代碼需要的依賴包是不一樣的。為了查找這些包,我們采用另外一個工具pyinstaller。具體步驟簡介如下:

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

總結

到此這篇關于使用python創(chuàng)建生成動態(tài)鏈接庫dll的方法的文章就介紹到這了,更多相關python動態(tài)鏈接庫dll內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python+kivy BoxLayout布局示例代碼詳解

    Python+kivy BoxLayout布局示例代碼詳解

    這篇文章主要介紹了Python+kivy BoxLayout布局的示例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Tensorflow的可視化工具Tensorboard的初步使用詳解

    Tensorflow的可視化工具Tensorboard的初步使用詳解

    這篇文章主要介紹了Tensorflow的可視化工具Tensorboard的初步使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • tensorflow 恢復指定層與不同層指定不同學習率的方法

    tensorflow 恢復指定層與不同層指定不同學習率的方法

    今天小編就為大家分享一篇tensorflow 恢復指定層與不同層指定不同學習率的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python安裝教程全過程(2022最新)

    Python安裝教程全過程(2022最新)

    這篇文章主要介紹了Python安裝教程全過程(2022最新版本),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python線程的幾種創(chuàng)建方式詳解

    python線程的幾種創(chuàng)建方式詳解

    這篇文章主要介紹了python線程的幾種創(chuàng)建方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python for i in range ()用法詳解

    Python for i in range ()用法詳解

    今天小編就為大家分享一篇Python for i in range ()用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python使用protobuf序列化和反序列化的實現(xiàn)

    Python使用protobuf序列化和反序列化的實現(xiàn)

    protobuf是一種二進制的序列化格式,相對于json來說體積更小,傳輸更快,本文主要介紹了Python使用protobuf序列化和反序列化的實現(xiàn),感興趣的可以了解一下
    2021-05-05
  • Python實現(xiàn)圖像尺寸和格式轉換處理的示例詳解

    Python實現(xiàn)圖像尺寸和格式轉換處理的示例詳解

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)圖像尺寸獲取和格式轉換處理的功能,文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-04-04
  • python3.3實現(xiàn)乘法表示例

    python3.3實現(xiàn)乘法表示例

    這篇文章主要介紹了python3.3實現(xiàn)乘法表示例,需要的朋友可以參考下
    2014-02-02
  • 使用Python在Word中插入圖片并文字環(huán)繞的方法

    使用Python在Word中插入圖片并文字環(huán)繞的方法

    在Word文檔中插入圖片能夠提供更直觀的信息,插入圖片時,我們還可以調整圖片大小,以及設置合適的文字環(huán)繞方式,本文將提供兩種使用Python在Word文檔中插入圖片并設置文字環(huán)繞的方法,需要的朋友可以參考下
    2024-06-06

最新評論