当前位置: 首页 > 科技观察

用Python实现批量打包程序的工具~

时间:2023-03-21 16:12:19 科技观察

最近看了一些大佬发的可视化打包工具auto-py-to-exe的文章。Auto-py-to-exe基于pyinstaller,但是相比pyinstaller,它有更多的GUI界面。自己也试了一下,感觉真的好用方便,动动手指头就可以打包程序。但是我发现auto-py-to-exe和pyinstaller都不能直接一次打包多个程序。如果要打包多个程序,就需要重新做一遍,所以对于一个程序员来说,这是一件不能容忍的事情。基于此,我写了一个基于pyinstaller的小批量打包程序。程序调用cmd命令。pyinstaller打包程序需要用到cmd命令。这里简单介绍一下调??用cmd命令的常用方法。os.system()system()是os模块的内置函数,可以将字符串转换成命令在终端执行:defsystem(*args,**kwargs):#realsignatureunknown"""在一个子shell中执行命令。"""pass这种方法的使用非常简单,只需将要执行的命令作为字符串放入函数中即可:importosos.system(f'pyinstaller-F-wD:\program.py')命令执行时不会出现cmd窗口,IDE默认显示,生成的文件默认在同一目录:os.一个可以读写的文件对象。默认为“r”读取。调用对象的read()或readlines()方法读取输出内容,源码如下:defpopen(cmd,mode="r",buffering=-1):ifnotisinstance(cmd,str):raiseTypeError("invalidcmdtype(%s,expectedstring)"%type(cmd))ifmodenotin("r","w"):raiseValueError("invalidmode%r"%mode)如果缓冲==0或缓冲为无:raiseValueError("popen()doesnotsupportunbufferedstreams"),bufsize=buffering)return_wrap_close(io.TextIOWrapper(proc.stdout),proc)else:proc=subprocess.Popen(cmd,shell=True,stdin=subprocess.PIPE,bufsize=buffering)return_wrap_close(io.TextIOWrapper(proc.stdin),proc)的用法只需要传入必要的参数,通过读或写的方式执行:os.popen(f'pyinstaller-F-wD:\Program.py').read()执行结果与os.system()相同,生成的文件在同一目录下subprocess.run()subprocess模块??正式用于替换一些旧模块methods,包含了很多内容方法,比os.system()和os.popen()更完整。subprocess模块??有多种调用cmd命令的方法,分别是Popen、call、run、getstatusoutput。这里我们只简单说明一下run()方法。subprocess.run()函数执行指定的命令,等待命令执行完成后返回包含执行结果的CompletedProcess类实例。用法与os.system()和os.popen()相同,传入的是字符串命令,但参数的选择比os.system()和os.popen()多了很多:subprocess.run(f'pyinstaller-F-wD:\Program.py')该方法默认不返回输出,只返回命令和执行状态。程序实现我们已经知道了多个程序调用cmd命令的方法。本文使用的是os.system()方法,使用起来非常简单。如果你需要更复杂的,你可以进行深入研究。用于构建GUI的库是PySimpleGUI:importosimportPySimpleGUIassg如果你还没有安装,可以使用pip命令安装:pipintsall库名GUI界面设计因为对功能没有特殊要求,只需要能够实现一次操作就可以实现多个包一个程序即可,最终设计代码如下:#themesettingsg.theme('LightBrown3')#layoutsettinglayout=[[sg.Frame(layout=[[sg.InputText(key='please_select_file',size=(24,1),font=("微软雅黑",10),enable_events=True),#FileBrowse只能选择单个文件FilesBrowse可以添加到s选择多个文件sg.FilesBrowse('获取文件',file_types=(("TextFiles","*.py"),),font=("MicrosoftYahei",10)),],],title='选择文件',title_color='blue',font=("微软雅黑",10),relief=sg.RELIEF_SUNKEN,)],[sg.Button('开始打包',font=("微软雅黑",10)),sg.Text('',font=("微软雅黑黑",10),size=(16,0)),sg.Button('退出程序',font=("微软雅黑",10),button_color='red')]#button_colorbluered]#createWindowwindow=sg.Window('打包工具',layout,font=("微软雅黑",12),default_element_size=(30,1))接口如下:通过接口获取gadget接口的逻辑设计。文件路径用“;”分隔,后面需要拆分:valuelist=[]#EventloopwhileTrue:#Exitbuttonevent,values=window.read()ifeventin(None,'Exittheprogram'):break#打开文件按钮ifevent=='please_select_file':fileName=values['please_select_file']#获取到的文件路径用“;”分隔,列表传入valuelist.append(fileName)ifevent=='Startpackaging':iflen(valuelist)!=0:#传入打包函数pyinstaller_(valuelist)else:sg.popup('文件未选中!')打包function函数接收一个list,需要循环读取;split分割的路径会生成一个列表,这个列表还是需要循环读取的;程序打包效果比较简单,-F和-w分别是生成单个可执行文件和取消显示命令行窗口:defpyinstaller_(valuelist):foriinvaluelist:a=i.split(';')forxina:os.system(f'pyinstaller-F-w{x}')终于生成了。exe可执行文件都存放在dist文件中:results..exe文件小工具的优缺点:优点:小工具的作用对于有其他需求的人来说用处不是很大,但是对于需要打包多个程序的人来说,还是有用的,毕竟你不得不拒绝重复操作。缺点:小工具的缺点很明显。它们不能对封装好的程序图标等进行操作,执行命令时只能一条一条执行,大大降低了效率。需要配合线程和进程。至此,我们已经成功使用Python解决了如何批量打包程序的需求,实现了双手的解放。