最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

將python程序打包成DLL的三種方式

 更新時(shí)間:2023年02月17日 14:10:12   作者:Ai_Taoism  
這篇文章主要介紹了將python程序打包成DLL的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

將python程序打包成DLL文件,然后用C++調(diào)用生成的DLL文件,這是一種用C++調(diào)用python的方法,這一塊比較容易遇到坑。

網(wǎng)上關(guān)于這一塊的教程不是很多,而且大部分都不能完全解決問題。

我在傻傻掙扎了幾天之后,終于試出了一個(gè)可行的版本,寫在這里供大家參考,也是供以后的自己參考。

Step1:用cython生成python腳本的.h和.c文件

首先我們要用到的一個(gè)工具叫cython,這個(gè)cython是python的第三方庫(kù),需要我們用pip來安裝,這個(gè)對(duì)于會(huì)使用pyhton的人來說超級(jí)簡(jiǎn)單,我在這里就不復(fù)述了。

安裝好cython之后,假如我們要用生成下面這個(gè)函數(shù)的dll文件。

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

我們只需要用vscode(或者是其他的python編譯器)生成一個(gè).pyx文件,然后文件里面的內(nèi)容如下。

cython: language_level=3
cdef public int str_add(const char* str1,const char* str2):
  return int(str1) + int(str2)

注意,一定要有第一行的內(nèi)容(網(wǎng)上很多教程都忽覺了這個(gè),可能導(dǎo)致不成功),如果你的電腦安裝的是python2,那么 language_level就要等于2。

編寫好.pyx文件(假如文件名為run.pyx)之后,然后我們?cè)诮K端運(yùn)行如下這句話。

cython run.pyx

運(yùn)行之后,就會(huì)生成兩個(gè)文件,一個(gè)run.h,一個(gè)run.c。這兩個(gè)文件之后要用來生成dll文件。

Step2:生成dll文件

生成run.h和run.c文件之后,我們就可以用visual studio來生成dll文件了。

先建立一個(gè)win32的動(dòng)態(tài)鏈接庫(kù)項(xiàng)目,然后配置好python環(huán)境。

如何配置python環(huán)境請(qǐng)參考這篇文章里面基本環(huán)境的搭建:http://m.fzitv.net/article/275652.htm

然后在源文件下面建立一個(gè)dllmain.cpp的文件,文件里面的內(nèi)容如下。

#include <Python.h>
#include <Windows.h>
#include "run.h"
extern "C"
{
	__declspec(dllexport) int __stdcall _str_add(const char * a, const char * b) //聲明導(dǎo)出函數(shù),類,對(duì)象等供外面使用
	{
		return str_add(a, b);
	}
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
	switch (fdwReason)
	{
	case DLL_PROCESS_ATTACH:
		Py_SetPath(L"D:/chengxuanzhuang/anaconda/envs/python3.6/Lib"); //這個(gè)要根據(jù)自己電腦python安裝的位置來
		Py_Initialize();
		//dll初始化的時(shí)候調(diào)用,這是python3的寫法,python2改成,initrun()。參見生成的run.h
		PyInit_run();
		break;
	case DLL_PROCESS_DETACH:
		Py_Finalize();
		break;
	}
	return TRUE;
}

在網(wǎng)上的其他教程里面,一般會(huì)忽略Py_SetPath這一句,在我的電腦上,沒有這一句一定會(huì)出錯(cuò),這個(gè)坑是我找了好久才找出來的。

寫好之后,編譯即可生成dll文件(注意選擇好編譯環(huán)境,最好是Release環(huán)境下,如果你的電腦是X64,一定不要選成了X86哦,在上一步配置python環(huán)境的時(shí)候,也要注意和這個(gè)對(duì)應(yīng)哦,別在debug下配置的python環(huán)境,然后在release下編譯哦)。

生成的dll文件一般在這個(gè)路徑之下。

項(xiàng)目目錄\\X64\\Release\\

Step3:測(cè)試dll文件

前兩步完成之后,我們就可以來測(cè)試生成的dll文件了。

首先,建立一個(gè)win32的控制臺(tái)項(xiàng)目。

然后將生成的dll文件復(fù)制到含源文件里面的.cpp文件的那個(gè)文件夾里。

然后在源文件里面創(chuàng)建一個(gè).cpp文件,文件內(nèi)容如下。

#include <Windows.h>
#include <iostream>
#include <tchar.h>
using namespace std;
int main()
{
	typedef int(*pAdd)(const char * a, const char * b);
	HINSTANCE hDLL = LoadLibrary(_T("python_to_DLL.dll"));
	cout << "hDLL:" << hDLL << endl;
	if (hDLL)
	{
		// 獲取DLL中需要調(diào)用的函數(shù)的地址
		pAdd pFun = (pAdd)GetProcAddress(hDLL, "_str_add");
		cout << "pFun:" << pFun << endl;
		const char* stra = "12";
		const char* strb = "22";
		if (pFun)
		{
			int i = pFun(stra, strb);
			cout << "i = " << i << endl;
		}
	}
	// 調(diào)用dll測(cè)試
	//將字符變成int然后相加
	system("pause");
	return 0;
}

運(yùn)行之后,結(jié)果如下。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python將Word文檔轉(zhuǎn)為PDF的兩種方法

    Python將Word文檔轉(zhuǎn)為PDF的兩種方法

    這篇文章主要介紹了兩種將docx和doc文件轉(zhuǎn)換為PDF的方法,方法一使用了docx2pdf模塊,方法二使用了win32com模塊,文中通過代碼及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • python計(jì)算機(jī)視覺opencv卡號(hào)識(shí)別示例詳解

    python計(jì)算機(jī)視覺opencv卡號(hào)識(shí)別示例詳解

    這篇文章主要為大家介紹了python計(jì)算機(jī)視覺opencv卡號(hào)識(shí)別的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下 希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 安裝pyinstaller遇到的各種問題(小結(jié))

    安裝pyinstaller遇到的各種問題(小結(jié))

    這篇文章主要介紹了安裝pyinstaller遇到的各種問題(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python實(shí)現(xiàn)對(duì)數(shù)組按指定列排序

    python實(shí)現(xiàn)對(duì)數(shù)組按指定列排序

    這篇文章主要介紹了python實(shí)現(xiàn)對(duì)數(shù)組按指定列排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 關(guān)于pytorch中網(wǎng)絡(luò)loss傳播和參數(shù)更新的理解

    關(guān)于pytorch中網(wǎng)絡(luò)loss傳播和參數(shù)更新的理解

    今天小編就為大家分享一篇關(guān)于pytorch中網(wǎng)絡(luò)loss傳播和參數(shù)更新的理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python中時(shí)間類型的JSON數(shù)據(jù)轉(zhuǎn)換

    Python中時(shí)間類型的JSON數(shù)據(jù)轉(zhuǎn)換

    在Python中,處理時(shí)間和日期數(shù)據(jù)以及與JSON數(shù)據(jù)的相互轉(zhuǎn)換是常見的任務(wù),本文主要為大家詳細(xì)如何在Python中處理時(shí)間類型的JSON數(shù)據(jù)轉(zhuǎn)換,需要的小伙伴可以參考下
    2024-02-02
  • Python中高級(jí)語(yǔ)法糖的使用示例詳解

    Python中高級(jí)語(yǔ)法糖的使用示例詳解

    Python?是一門簡(jiǎn)潔而強(qiáng)大的編程語(yǔ)言,具備許多高級(jí)語(yǔ)法糖(syntactic?sugar)功能,本文將介紹一些常見的Python高級(jí)語(yǔ)法糖,以及如何使用它們來提高代碼質(zhì)量和開發(fā)效率,需要的小伙伴可以參考下
    2024-01-01
  • Python集合set的交集和并集操作方法

    Python集合set的交集和并集操作方法

    這篇文章主要介紹了Python集合set的交集和并集操作方法小,python的set,是一個(gè)無序不重復(fù)元素集,?基本功能包括關(guān)系測(cè)試和消除重復(fù)元素本文講述了python中set集合的比較方法包括交集,并集,差集,下文更多詳細(xì)資料,需要的小伙伴可以參考一下
    2022-03-03
  • Python中PDF解析利器pdfplumber的使用詳細(xì)教程

    Python中PDF解析利器pdfplumber的使用詳細(xì)教程

    pdfplumber是一個(gè)Python庫(kù),專門用于從PDF文件中提取文本、表格和其他信息,本文將為大家詳細(xì)介紹一下pdfplumber的安裝與詳細(xì)使用,有需要的小伙伴可以參考下
    2025-04-04
  • Pandas分組與排序的實(shí)現(xiàn)

    Pandas分組與排序的實(shí)現(xiàn)

    這篇文章主要介紹了Pandas分組與排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評(píng)論

南昌县| 郑州市| 县级市| 迁西县| 梁河县| 建瓯市| 塔城市| 江都市| 岫岩| 玉屏| 睢宁县| 邵东县| 朝阳区| 乐安县| 博罗县| 克拉玛依市| 灵丘县| 云和县| 海盐县| 池州市| 临泉县| 涪陵区| 洛阳市| 东丰县| 寻甸| 永寿县| 礼泉县| 沾化县| 光山县| 枞阳县| 大名县| 翁源县| 林西县| 沐川县| 康平县| 凤翔县| 台南县| 东阳市| 渝中区| 南宫市| 古蔺县|