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

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

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

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

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

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

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

首先我們要用到的一個工具叫cython,這個cython是python的第三方庫,需要我們用pip來安裝,這個對于會使用pyhton的人來說超級簡單,我在這里就不復述了。

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

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

我們只需要用vscode(或者是其他的python編譯器)生成一個.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)上很多教程都忽覺了這個,可能導致不成功),如果你的電腦安裝的是python2,那么 language_level就要等于2。

編寫好.pyx文件(假如文件名為run.pyx)之后,然后我們在終端運行如下這句話。

cython run.pyx

運行之后,就會生成兩個文件,一個run.h,一個run.c。這兩個文件之后要用來生成dll文件。

Step2:生成dll文件

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

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

如何配置python環(huán)境請參考這篇文章里面基本環(huán)境的搭建:http://www.dbjr.com.cn/article/275652.htm

然后在源文件下面建立一個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) //聲明導出函數(shù),類,對象等供外面使用
	{
		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"); //這個要根據(jù)自己電腦python安裝的位置來
		Py_Initialize();
		//dll初始化的時候調(diào)用,這是python3的寫法,python2改成,initrun()。參見生成的run.h
		PyInit_run();
		break;
	case DLL_PROCESS_DETACH:
		Py_Finalize();
		break;
	}
	return TRUE;
}

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

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

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

項目目錄\\X64\\Release\\

Step3:測試dll文件

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

首先,建立一個win32的控制臺項目。

然后將生成的dll文件復制到含源文件里面的.cpp文件的那個文件夾里。

然后在源文件里面創(chuàng)建一個.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測試
	//將字符變成int然后相加
	system("pause");
	return 0;
}

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

總結(jié)

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

相關(guān)文章

  • python 使用OpenCV進行簡單的人像分割與合成

    python 使用OpenCV進行簡單的人像分割與合成

    這篇文章主要介紹了python 使用OpenCV進行簡單的人像分割與合成的方法,幫助大家更好的利用python處理圖像,感興趣的朋友可以了解下
    2021-02-02
  • python版學生管理系統(tǒng)

    python版學生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python版學生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python random模塊的使用示例

    Python random模塊的使用示例

    這篇文章主要介紹了Python random模塊的使用示例,幫助大家更好的理解和使用python生成隨機數(shù),感興趣的朋友可以了解下
    2020-10-10
  • python實現(xiàn)登陸知乎獲得個人收藏并保存為word文件

    python實現(xiàn)登陸知乎獲得個人收藏并保存為word文件

    這篇文章主要介紹了python實現(xiàn)登陸知乎獲得個人收藏并保存為word文件,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • Python爬取科目四考試題庫的方法實現(xiàn)

    Python爬取科目四考試題庫的方法實現(xiàn)

    這篇文章主要介紹了Python爬取科目四考試題庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • python對json的相關(guān)操作實例詳解

    python對json的相關(guān)操作實例詳解

    這篇文章主要介紹了python對json的相關(guān)操作,結(jié)合實例形式詳細分析了json的概念、功能以及Python針對json的解析、輸出、排序、轉(zhuǎn)換等操作技巧,需要的朋友可以參考下
    2017-01-01
  • Python發(fā)送手機動態(tài)驗證碼代碼實例

    Python發(fā)送手機動態(tài)驗證碼代碼實例

    這篇文章主要介紹了Python發(fā)送手機動態(tài)驗證碼代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 一步步教你用Python實現(xiàn)2048小游戲

    一步步教你用Python實現(xiàn)2048小游戲

    相信2048這個游戲?qū)Υ蠹襾碚f一定不陌生,下面這篇文章就主要給大家介紹了怎么用Python實現(xiàn)2048小游戲,文中通過注釋與示例代碼介紹的很詳細,相信對大家的理解和學習具有一定的參考借鑒價值,有需要的朋友們一起來看看吧。
    2017-01-01
  • Python實現(xiàn)操縱控制windows注冊表的方法分析

    Python實現(xiàn)操縱控制windows注冊表的方法分析

    這篇文章主要介紹了Python實現(xiàn)操縱控制windows注冊表的方法,結(jié)合實例形式分析了Python使用_winreg模塊以及win32api模塊針對Windows注冊表操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • python使用json.dumps輸出中文問題

    python使用json.dumps輸出中文問題

    這篇文章主要介紹了python使用json.dumps輸出中文問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論