中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python封裝dll的方法

發布時間:2020-09-02 09:57:30 來源:億速云 閱讀:433 作者:小新 欄目:編程語言

這篇文章主要介紹了python封裝dll的方法,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

Cython是結合了Python和C的語法的一種語言,可以簡單的認為就是給Python加上了靜態類型后的語法。

python學習網,大量的免費python視頻教程,歡迎在線學習!

安裝Cython

如果已經安裝過Cython可以跳過此步。安裝Cython需要使用easy_install,Python 2.7.9 以上的版本已經自帶easy_install。在Visual Studio的命令提示符下完成(注意配合Python版本使用32位還是64位的Visual Studio的命令提示符,有可能需要以管理員權限運行):

easy_install -U cython

使用Cython編譯

在PyCharm中新建工程,然后新建一個py文件:great_module.py,在該文件中輸入如下內容:

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

這是一個簡單的將字符串轉換為int求和的函數。為了使該函數能夠被Cython編譯,需要新建一個run.pyx文件,并加入如下內容:

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

這其中的cdef和public等都是cython關鍵字,這些關鍵字可以幫助函數可以被外部調用。然后在PyCharm中使用下面的命令編譯,生成run.h和run.c兩個文件。

cython run.pxy

Cython是支持Python的動態類型特性的,如果后續步驟使用VS的命令行編譯也可以生成DLL,但是我在實驗時不知為何無法提取到DLL中的函數地址,所以這里統一使用靜態類型,所有參數和返回值都使用Cython的靜態類型關鍵字規定好數據類型。

通過VS編譯得到動態鏈接庫

在得到了.c和.h文件后,我們需要為其創建一個VS DLL工程。打開VS軟件,新建win32項目,其中應用程序類型選擇DLL,附加選項選擇空項目。 將剛剛的.c和.h文件復制到項目存放代碼的文件夾并添加到項目中。在項目中添加一個空的dllmain.cpp,并添加如下代碼:

#include <Python.h>
#include <Windows.h>
#include "run.h"
extern "C"
{
  __declspec(dllexport) int __stdcall _str_add(const char * a, const char * b)
  {
    return str_add(a, b);
  }
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) 
{
  switch (fdwReason) 
  {
    case DLL_PROCESS_ATTACH:
      Py_Initialize();
      //dll初始化的時候調用,這是python3的寫法,python2改成,initrun()。參見生成的run.h
      PyInit_run();
      break;
    case DLL_PROCESS_DETACH:
      Py_Finalize();
      break;
  }
  return TRUE;
}

右鍵項目,屬性,進入VC++目錄標簽頁。在包含路徑中添加Python的include路徑,如“C:\ProgramFiles\Python36\include”。在庫目錄中添加Python的lib,如“C:\Program Files\Python36\libs”。注意編譯的版本選擇Release,根據Python版本選擇x64平臺或x32平臺。 編譯后即可得到dll文件。

感謝你能夠認真閱讀完這篇文章,希望小編分享python封裝dll的方法內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霍邱县| 犍为县| 宝应县| 阿克苏市| 怀安县| 彭阳县| 盱眙县| 嵊泗县| 巴青县| 吕梁市| 石嘴山市| 阿拉善左旗| 富蕴县| 安岳县| 皋兰县| 上栗县| 青神县| 巴楚县| 喀喇| 华亭县| 三都| 天津市| 玉田县| 永新县| 青田县| 乌海市| 武川县| 策勒县| 凭祥市| 象州县| 额尔古纳市| 元江| 双桥区| 牡丹江市| 涞源县| 永定县| 沙河市| 紫金县| 康平县| 郸城县| 松桃|