python怎么生成dll,python怎么生成随机数
使用python创建生成动态链接库dll
如今,随着深度学习的发展,python已经成为深度学习研究的第一语言。大多数深度学习工具包都有python版本,很多重要的算法都有python版本。为了将这些算法应用到具体的项目中,这些工具包还提供了不同类型的接口。
动态链接库(。dll,所以)是系统开发中跨语言协作的一种非常重要的方式。用python语言编写的算法编译成动态库,可以被其他语言调用,可以大大提高算法开发的效率。
但是,虽然python可以调用其他语言生成的动态库,但是python本身作为脚本语言,并不能直接编译生成动态库。为了生成动态库,我们使用cython将python脚本转换成C语言文件。通过一个简单的例子说明具体过程。
defstr_add(str1,str2):
代码returnint(str1) int(str2)将两个数字的字符串转换成数字,并对它们求和。让我们将这段代码保存为run.py供以后使用。根据cython的语法,我们给出cython版本的函数:
cdefpublicstr_add(str1,str2):
与之前的python版本相比,returnint(str1) int(str2) cdef替换了def,并添加了public关键字来表示这个函数是要导出的。将这段代码保存为pyx文件,例如run.pyx
相关:《Python教程》
接下来,我们执行以下命令,将这段代码转换成C语言版本:
Cythonrun.pyx此时目录下诞生了run.h和run.c两个文件。这两个文件通过调用python的C-API实现了run.py代码的功能。
接下来,我们编写动态库的主文件dllmain.c:
#includePython.h
#includeWindows.h
#包含“run.h”
extern _ _ declspec(dll export)int _ _ stdcall _ str _ add(const char * a,constchar*b){
returnPyLong _ AsLong(str _ add(py unicode _ from string(a),py unicode _ from string(b)));英国铁路公司
}
BOOLWINAPIDllMain(hinstanceinstdll,DWORDfdwReason,LPVOIDlpReserved){
开关(fdwReason){
caseDLL_PROCESS_ATTACH:
py _ Initialize();
py init _ run();#dll在初始化时被调用。python3就是这么写的,python2改成,initrun()。查看生成的run.h
打破;
caseDLL_PROCESS_DETACH:
py _ Finalize();
打破;
}
returnTRUE
}这个文件定义了导出函数_str_add。在python中,所有数据都存储为pyobject。该函数通过PyUnicode_FromString将两个字符串转换为python对象类型,调用run.h中的函数str_add进行求和,通过PyLong_AsLong函数将python对象的结果转换为整数。
我们可以通过以下命令编译这段代码来生成dll:
CL/LD DLLMAIN。克鲁恩。c-IC 3360 \ python 36 \ include c 3360 \ python 36 \ libs \ Python 36 . lib这里Python的路径,根据Python在不同电脑中的安装位置,要做相应的调整。
生成dll,让我们编写一个简单的调用并测试它:
#包含“stdio.h”
#包含“stdlib.h”
extern _ _ declspec(dll export)int _ _ stdcall _ str _ add(const char * a,const char * b);
#pragmacomment(lib, dllmain.lib )
intmain()
{
printf(%d\n ,_str_add(123 , 456 );
return0
}输出结果:579,正好等于123 456。
通过以上步骤,我们已经能够将python代码实现的功能封装成一个动态库。然而,这个动态库不能在没有安装python的机器上运行。事实上,python代码通常需要许多依赖包才能运行。此外,每段代码需要不同的依赖包。为了找到这些包,我们使用另一个工具pyinstaller。具体步骤如下:
(1)virtualenv envpack #创建新环境,python包依赖复杂,创建新环境可以减少最终引入的包;
(2)cd envpack #进入目录;
(3)#将run.py复制到这个目录。run.py所需的包与最终dll所需的包相同;
(4)Scripts\activate #激活并切换到virtualenv环境;
(5)pip install pyinstaller #安装打包工具py installer;
(6)pip安装numpy #安装numpy等脚本需要的库,检查你的导入;
(7)pyinstaller run.py #打包命令;
(8)8)Scripts \ deactivate #打包成功后,使用命令停用环境;
(9)要打包的文件在envpack\dist,包括很多。dll和。pyd文件。只需将这些文件与dll一起发布。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。