当前位置: 首页 > 编程笔记 >

使用python创建生成动态链接库dll的方法

韩梓
2023-03-14
本文向大家介绍使用python创建生成动态链接库dll的方法,包括了使用python创建生成动态链接库dll的方法的使用技巧和注意事项,需要的朋友参考一下

如今,随着深度学习的发展,python已经成为了深度学习研究中第一语言。绝大部分的深度学习工具包都有python的版本,很多重要算法都有python版本的实现。为了将这些算法应用到具体工程中,这些工具包也提供了不同类型的接口。

动态链接库(.dll,.so)是系统开发中一种非常重要的跨语言协作方式。把python语言写成的算法编译成动态库,能够提供给其他语言调用,这能够在很大程度上提高算法的开发效率。

但是,虽然python可以调用其他语言生成的动态库,python作为一种脚本语言,本身是不能直接编译生成动态库的。为了生成动态库,我们借助cython,将python脚本变成c语言文件。具体过程,我们通过一个简单的例子来解释。

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

  这个代码,将两个数字组成的字符串转化成数字,并求和。我们把这个代码保存成run.py备用。根据cython的语法,我们给出cython版本的函数:

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

  和前面python版本的相比,cdef替换了def,并加了public关键字,表示这个函数要导出。将这个代码保存成pyx文件,比如run.pyx。

接下来,我们执行如下命令,把这个代码变成c语言版本:

cython run.pyx

这时,目录下面生出来run.h和run.c两个文件。这个两个文件通过调用python的C-API实现了run.py代码的功能。

接下来,我们编写动态库的主文件dllmain.c:

#include <Python.h>
#include <Windows.h>
#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)));<br data-filtered="filtered">
}
 
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) {
  switch( fdwReason ) {
    case DLL_PROCESS_ATTACH:
      Py_Initialize();
      PyInit_run(); #dll初始化的时候调用,这是python3的写法,python2改成,initrun()。参见生成的run.h
      break;
    case DLL_PROCESS_DETACH:
      Py_Finalize();
      break;
  }
  return TRUE;
}

  该文件定义了导出函数_str_add。在python中,所有数据都以pyobject进行存储。这个函数通过PyUnicode_FromString,将两个字符串变成python对象类型,并调用run.h里面的函数str_add求和,并把结果通过PyLong_AsLong函数从python对象,变成整形数字。

我们可以通过如下命令,将这个代码编译生成dll:

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

这里python的路径,根据不同电脑python的安装位置,做相应调整。

生成的dll,我们写个简单调用,测试一下:

#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;
}

  输出结果: 579,正好等于123+456。

通过以上步骤,我们已经能够把python代码实现的功能,封装成动态库。然而,这个动态库无法在没有安装python的机器上面运行。事实上,python代码,通常需要很多依赖包才能运行。而且,每段代码需要的依赖包是不一样的。为了查找这些包,我们采用另外一个工具pyinstaller。具体步骤简介如下:

virtualenv envpack # 创建新的环境,python包依赖比较复杂,创建新环境可以减少最终引入的包
cd envpack # 进入目录
#复制run.py到这个目录,run.py运行需要的包,和最终dll需要的包是一样的
Scripts\activate # 激活并切换到virtualenv环境
pip install pyinstaller # 安装打包工具pyinstaller
pip install numpy # 安装numpy等脚本需要的库,查看你的import
pyinstaller run.py # 打包命令
Scripts\deactivate # 打包成功后,使用命令取消激活环境
需要打包的文件在envpack\dist, 包括很多.dll和.pyd文件,把这些文件和dll一起发布即可。

总结

到此这篇关于使用python创建生成动态链接库dll的方法的文章就介绍到这了,更多相关python动态链接库dll内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍javascript动态创建链接的方法,包括了javascript动态创建链接的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript动态创建链接的方法。分享给大家供大家参考。具体分析如下: 动态创建链接示例: 希望本文所述对大家的javascript程序设计有所帮助。

  • 我也用同样的结果尝试了这个视频中的建议。 最后一件事,我已经没有想法了:在Chrome开发者控制台,我看到创建失败,错误为400,这表明我需要更新白名单URL。我通过添加以下URL实现了这一点: 这个问题一直让我抓狂。我想我什么都试过了。让我想知道我是否需要在Firebase中重新创建我的应用程序。

  • 主要内容:静态链接库,动态链接库,总结我们知道,C、C++程序从源文件到生成可执行文件需经历 4 个阶段,分别为预处理、编译、汇编和链接,本节将重点围绕链接阶段,对静态链接库和动态链接库做详细的讲解。 有关链接操作的具体细节,感兴趣的读者可阅读《 到底什么是链接,它起到了什么作用?》和《 符号——链接的粘合剂》这两节。总的来说链接阶段要完成的工作,就是将同一项目中各源文件生成的目标文件以及程序中用到的库文件整合为一个可执行文件。 通过

  • 问题内容: 我需要在运行时为方法生成代码。能够运行任意代码并具有文档字符串非常重要。 我想出了一个结合和的解决方案,这是一个虚拟的示例: 是否有更好/更安全/更惯用的方式获得相同的结果? 问题答案: 基于Theran的代码,但将其扩展为类的方法: 应该打印:

  • 动态链接库(也称为DLL)是Microsoft Windows最重要的组成要素之一。大多数与Windows相关的磁盘文件如果不是程序模块,就是动态链接程序。迄今为止,我们都是在开发Windows应用程序;现在是尝试编写动态链接库的时候了。许多您已经学会的编写应用程序的规则同样适用于编写这些动态链接库模块,但也有一些重要的不同。 动态链接库的基本知识 正如前面所看到的,Windows应用程序是一个可

  • 在一些情况下,必须使用动态连接库: 1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。 2.在钩子程序过滤系统消息时必须使用动态连接库 3.设备驱动程序必须是动态连接库 4.如果要在对话框编辑器中使用自己定义的控件,也必须使用动态连接库 5.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与