首页 程序笔记 如何将python写的程序打包成DLL动态库

如何将python写的程序打包成DLL动态库

前言

Python中有大量的开源的算法库可以使用,如果已有用Python写的一些算法,希望在其他语言中使用,可以将python程序打包成DLL文件,然后用C/C++/C#等语言调用生成的DLL文件,这是一种用python导出dll的方法,其中比较容易遇到坑,网上关于Python导出dll的教程不是很多,而且大部分都不能完全解决问题,借鉴了CSDN的一篇博客,整理出一个可行的版本,记录在这里供大家参考,也留着备忘。

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

首先我们要用到的一个工具叫cython,cython是python的三方库,我们需要用pip install来安装,这个对于会使用pyhton的人来说超级简单,这里就不详说了。
安装好cython之后,假如我们要用生成下面这个函数的dll文件。

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

我们只需要添加一个.pyx文件,文件的内容如下:

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

注意,一定要有第一行的内容(网上很多教程都忽觉了这个,可能导致不成功),如果你的电脑安装的是python2,那么 language_level就要等于2。编写好.pyx文件(假如文件名为run.pyx)之后,然后我们在终端运行如下命令:

cython run.pyx

运行之后,就会生成两个文件,一个run.h,一个run.c。这两个文件之后要用来生成dll文件。

Step2:生成dll文件

生成run.h和run.c文件之后,我们就可以用这个C语言源文件生成动态库dll文件了。
先建立一个win32的动态链接库项目,然后配置好python环境。

如何配置python环境请参考这篇博客里面基本环境的搭建:https://blog.csdn.net/ahhhhhh520/article/details/110902251。

然后在工程中添加一个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_SetPath(LC:/python3.6/Lib); //这个要根据自己电脑python安装的位置来
		Py_Initialize();
		//dll初始化的时候调用,这是python3的写法,python2改成,initrun()。参见生成的run.h
		PyInit_run();
		break;
	case DLL_PROCESS_DETACH:
		Py_Finalize();
		break;
	}
	return TRUE;
}

在网上的其他教程里面,一般会忽略Py_SetPath这一句,在我的电脑上,没有这一句一定会出错,这个坑是我找了好久才找出来的。写好之后,编译即可生成dll文件(注意选择好编译环境,最好是Release环境下,如果你的电脑是X64,一定不要选成了X86哦,在上一步配置python环境的时候,也要注意和这个对应哦,别在debug下配置的python环境,然后在release下编译哦)。生成的dll文件一般在这个路径之下。

项目目录\\X64\\Release\\

Step3:在C/C++程序中测试dll文件

Step1,2完成之后,就可以测试生成的dll文件了。

  • 首先,建立一个win32的控制台项目。
  • 然后,将生成的dll文件复制到含源文件里面的.cpp文件的那个文件夹里。
  • 然后,在源文件里面创建一个.cpp文件,文件内容如下。
#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中需要调用的函数的地址
		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;
		}
	}
	// 调用dll测试
	//将字符变成int然后相加
	system(pause);
	return 0;
}

运行之后,输出结果如下:

参考原文链接(感谢原文作者):https://blog.csdn.net/ahhhhhh520/article/details/111066334

1

站心网

前言 Python中有大量的开源的算法库可以使用,如果已有用Python写的一些算法,希望在其他语言中使用,可以..

为您推荐

彩虹目录列表程序v1.5源码下载

彩虹目录列表是一款用PHP开发的目录列表程序,无需数据库,安装简单,使用方便。功能特点:在线预览图片、视频、音频、文本文件、Markdown文件、Office文档等自动识别目录下的README.md文件并展示(类GitHub)后台管..

谈谈程序猿的职业方向

大学生在校期间可能会有这样的疑问:将来就业干啥好呢?如果你是学计算机的,将来想进入软件和互联网行业,恭喜,这是个好行业,薪水很高, 也不需靠关系,一切靠实力说话,不需要有个好爸爸。坏处是,这个行业需要..

.NET 主程序的.dll.config文件有什么用?

.dll.config 文件通常是在开发过程中自动生成的,它的主要作用是为某个类库(.dll 文件)提供一个独立的配置文件,以便开发者可以为该类库单独定义或测试配置项。以下是生成 .dll.config 文件的原因和机制:1. 配置..

一个简单的大转盘抽奖程序(附.NetCore Demo源码)

最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql1.前端实现:前端用的是基于开源的lottery,其中有些改动的,使得前端可以自适应pc端..

关于程序员的职业规划

对于绝大部分从事互联网、程序员的群体来说,看中的不仅是一个白领工作,更重要的是他高薪资的待遇,就当前来说,IT行业发展速度突飞猛进,就业方向和前景更是百家争鸣,如果对自己没有一个明确的目标而漫无目的,那..

使用System.Linq.Dynamic.Core扩展库动态构建 LINQ 查询

System.Linq.Dynamic.Core 是一个扩展库,用于在运行时动态构建 LINQ 查询,支持字符串形式的表达式解析和动态查询操作。它是 .NET 的一个强大工具,适合处理需要灵活定义查询逻辑的场景,例如动态过滤、排序、投影..

从程序媛角度去看项目管理

需求管理下图描述的是程序员从接到需求到开发环节的过程:一般我们首先会收到产品的PRD或交互稿,被询问今天什么时间点是否有空,进行需求评审。时光匆匆,回想起刚毕业那时,我望着冗长的PRD,直接跳过背景、目的等..

ASP.NET如何将Views文件夹从项目分离

将 Views 文件夹从 ASP.NET 项目中分离是一个常见需求,比如为了实现模块化或分层架构。以下是实现此功能的完整步骤,从项目中分离 Views 文件夹,将其移到另一个独立的文件夹或项目中,并确保视图渲染仍然正常。1. ..

如何让AI写出Google认可的文章?

让 AI 写出 Google 认可的文章,核心在于满足 Google 的搜索排名算法要求。这些要求通常围绕以下几个关键点展开:内容质量、用户体验 和 SEO 优化。以下是详细指导:一、内容质量确保文章原创且有价值避免抄袭:Goog..

如何从.NET Framework迁移到.NET Core或.NET 6/7?

从 .NET Framework 迁移到 .NET Core 或 .NET 6/7 是一个提升性能和跨平台能力的关键过程。以下是迁移的主要步骤和注意事项:迁移步骤1. 评估当前项目依赖项检查:确保所有第三方库和NuGet包都有与 .NET Core/.NET 6..

如何优化ASP.NET Core应用的性能?

优化ASP.NET Core应用性能需要从代码、数据库、配置、服务器和部署等多个层面进行综合考虑。以下是一些优化ASP.NET Core应用性能的关键方法和技巧:1. 代码级优化使用异步编程:避免阻塞线程,通过async和await处理I..

chrome 开发者工具如何查看元素:hover时的样式

在 Chrome 开发者工具中查看元素的 :hover 样式,可以通过以下步骤实现:打开开发者工具:右键点击页面中的元素,然后选择“检查(Inspect)”或按下 F12 或 Ctrl + Shift + I (Windows) / Cmd + Option +..

如何防止web应用DOS攻击?

防止web应用DOS攻击的最好的方法是什么? 如何防止web应用DOS攻击? 与所有的拒绝服务(DOS)攻击相关的一件事是他们都不可能避免。最好的方法是把重点放在减少影响DOS攻击的方法上。如果你有一个网络,黑客想要玩一玩..

数据库SQL Server2014和SQL Server2019的区别和如何选择?

SQL Server 2014和SQL Server 2019是微软公司发布的两个版本的数据库管理系统,它们在性能、安全性以及可扩展性等方面各有特点。在选择这两个数据库版本时,需要根据系统需求、预算状况以及技术团队的熟悉程度等因素..

MySQL如何建数据库

MySQL是一款非常流行的关系型数据库管理系统。无论是在企业还是个人项目中,都经常使用MySQL数据库。在使用MySQL之前,需要先创建一个数据库。本文将介绍如何建立MySQL数据库。一、安装MySQL在开始建立MySQL数据库之..

jwt是什么?.NET Core API如何使用JwtBearer验证

JWT是JSON Web Token的缩写,是一种开放标准(RFC 7519),用于在网络上以安全和可靠的方式传输信息。它是一种被广泛使用的跨域身份验证解决方案,可以将用户信息、访问权限等加密后存储在Token中,然后通过网络传输..

什么是微服务架构?它与单体应用程序架构有什么区别?如何在.NET中实现微服务架构?

微服务架构是一种软件架构风格,通过将应用程序拆分为一组小型、自治的服务来构建应用程序。每个服务都专注于解决特定的业务功能,并通过轻量级的通信机制进行交互。这些服务可以独立开发、部署和扩展,可以使用不同..

winform如何隐藏边框和标题栏

在WinForms中,可以通过以下步骤来隐藏窗体的边框和标题栏:打开WinForms应用程序的窗体设计器。选择窗体控件,然后在属性窗口中找到FormBorderStyle属性。将FormBorderStyle属性设置为None,以指示窗体不显示边框。..

程序员如何量化炒股?原理是什么?

作为程序员,可以运用编程技能和量化分析来帮助量化炒股。量化炒股有哪些步骤和方法?收集数据:需要收集有关股票市场的数据。可以从各种来源获取这些数据,如Yahoo财经、谷歌财经、股票交易所等。可以使用Python等..

如何让Google谷歌搜索引擎找到并收录网站

Google谷歌会使用大量计算机来抓取网络上数十亿的页面, 这个名为 Googlebot 的抓取工具基本上从以前抓取生成的网页 URL 列表开始,然后使用 Google Search Console 中提供的站点地图数据扩充这些页面。 在抓取过程..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制