找回密码
 会员注册
查看: 32|回复: 0

python将py文件封装为库(pyd文件)

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
72245
发表于 2024-9-7 16:37:48 | 显示全部楼层 |阅读模式
目录0.封装作用1.安装cython库2.封装示例例子1:将一个py文件封装为pyd文件1.创建.py文件2.创建.pyx文件3.创建setup.py文件4.执行编译命令生成pyd文件5.测试pyd文件例子2:一次性生成多个pyd文件1.创建setup.py2.在命令行中编译生成.pyd文件3.测试0.封装作用不想公开重要部分源码。pyd文件是由c中间文件编译生成的模块文件,类似so和dll库文件等,不易反编译出源码。1.安装cython库pipinstallCython2.封装示例例子1:将一个py文件封装为pyd文件1.创建.py文件首先,需要有一个Python的.py文件,作为要打包的源代码。#file:hello.pydefsay_hello_to(name):print(f"Hello{name}!")'运行运行2.创建.pyx文件很简单,就是创建一个后缀为.pyx的文件,然后将py文件中的代码复制过来即可#file:hello.pyxdefsay_hello_to(name):print(f"Hello{name}!")'运行运行3.创建setup.py文件为了将Cython的.pyx文件编译生成.pyd文件,需要创建一个setup.py文件。以下为示例代码,将hello_cython.pyx生成一个名为hello_cython.pyd的文件#file:setup.pyfromdistutils.coreimportsetupfromCython.Buildimportcythonizesetup(name='Helloworldapp',ext_modules=cythonize("hello.pyx"))4.执行编译命令生成pyd文件cd到代码目录所在位置D:\Python3.6.6\python.exesetup.pybuild_ext--inplace示例如下执行命令前的用到的文件执行命令后新生成的文件5.测试pyd文件pyd文件名为hello.cp36-win_amd64.pyd,前缀为hello,因此模块名为hello用一个test.py来测试#file:test.pyimporthelloif__name__=="__main__":hello.say_hello_to("xxx")#xxx运行结果D:\Python3.6.6\python.exeD:\projects\python_lib\test.pyHelloxxx!Processfinishedwithexitcode0可以看到测试成功例子2:一次性生成多个pyd文件下面给出另一个具体的例子,将工作路径切换到src目录下,打包该目录下所有的.py文件为.pyd文件1.创建setup.py在src目录下,创建setup.py文件,输入以下内容:#setup.pyfromdistutils.coreimportsetupfromCython.Buildimportcythonizeimportosdirectory='.'#设置源代码所在的目录,这里设置为当前目录#获取该目录下所有的文件名sources=[os.path.join(directory,file)forfileinos.listdir(directory)iffile.endswith('.py')]setup(ext_modules=cythonize(sources))2.在命令行中编译生成.pyd文件在命令行中,切换到src目录下,执行以下编译命令:pythonsetup.pybuild_ext--inplace执行该命令后,会在src目录下生成一些.pyd文件,这些文件与相应的.py文件位于同一目录下示例:需打包的py文件情况如下DataTool.py内容为#fileataTool.pydefformat_data(x:int)->int:returnx*100'运行运行OrderTool.py内容为#file:OrderTool.pydefdivide_quantity(quantity:int,num:int)->list:k=quantity//(num*100)rest=quantity-k*num*100ret=[100*kforiinrange(num)]foriinrange(num):ifrest>=100:ret[i]+=100rest-=100elifrest>0:ret[i]+=restrest=0else:breakreturnret'运行运行setup.py文件内容为#setup.pyfromdistutils.coreimportsetupfromCython.Buildimportcythonizeimportosdirectory='.'#设置源代码所在的目录,这里设置为当前目录#获取该目录下所有的文件名sources=[os.path.join(directory,file)forfileinos.listdir(directory)iffile.endswith('.py')andfilenotin["main.py"]]setup(ext_modules=cythonize(sources))执行命令cd到py文件所在目录D:\Python3.6.6\python.exesetup.pybuild_ext--inplace然后就可以看到新生成的很多文件了,其中就有我们需要的pyd文件3.测试测试一下,我们将源代码文件DataTool.py和OrderTool.py从当前目录移动到其他文件夹去,来测试pyd文件是否有效。main.py文件内容如下fromDataToolimport*fromOrderToolimport*if__name__=='__main__':x=27data=format_data(x)print(data)divide_ret=divide_quantity(data,5)print(divide_ret)运行结果如下,可以看到是有效的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 05:54 , Processed in 0.447878 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表