1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      python生成dll的方法

      小編給大家分享一下python生成dll的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

      10年積累的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先建設(shè)網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有未央免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

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

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

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

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

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

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

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

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

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

      cython run.pyx

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

      接下來,我們編寫動態(tài)庫的主文件dllmain.c:

      #include 
      #include 
      #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)));
      }   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()。參見生成的run.h             break;         case DLL_PROCESS_DETACH:             Py_Finalize();             break;     }     return TRUE; }

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

      我們可以通過如下命令,將這個代碼編譯生成dll:

      cl /LD dllmain.c run.c -IC:\python36\include C:\python36\libs\python36.lib

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

      生成的dll,我們寫個簡單調(diào)用,測試一下:

      #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。

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

      (1)virtualenv envpack # 創(chuàng)建新的環(huán)境,python包依賴比較復(fù)雜,創(chuàng)建新環(huán)境可以減少最終引入的包;

      (2)cd envpack # 進(jìn)入目錄;

      (3)#復(fù)制run.py到這個目錄,run.py運(yùn)行需要的包,和最終dll需要的包是一樣的;

      (4)Scripts\activate # 激活并切換到virtualenv環(huán)境;

      (5)pip install pyinstaller # 安裝打包工具pyinstaller;

      (6)pip install numpy # 安裝numpy等腳本需要的庫,查看你的import;

      (7)pyinstaller run.py # 打包命令;

      (8)Scripts\deactivate # 打包成功后,使用命令取消激活環(huán)境;

      (9)需要打包的文件在envpack\dist, 包括很多.dll和.pyd文件,把這些文件和dll一起發(fā)布即可。

      看完了這篇文章,相信你對python生成dll的方法有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


      當(dāng)前標(biāo)題:python生成dll的方法
      分享路徑:http://www.ef60e0e.cn/article/gssggi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        万荣县| 庄河市| 贵德县| 龙门县| 民权县| 柞水县| 石棉县| 手游| 建阳市| 宁远县| 滁州市| 汤原县| 五大连池市| 大埔县| 杂多县| 威宁| 海宁市| 博湖县| 博兴县| 华宁县| 涟源市| 保山市| 夏津县| 漠河县| 运城市| 永兴县| 南涧| 化德县| 芦山县| 区。| 阿拉尔市| 连州市| 五家渠市| 樟树市| 天等县| 宝山区| 苏州市| 响水县| 秦皇岛市| 永春县| 扎鲁特旗|