windows平台打包
流程
如果需要打包的文件中包含所需的相关资源文件,譬如在将pyqt界面打包时,我们会设置一些默认的图片,这些都属于资源文件。那么尽量下面的步骤来进行,先进行测试解决可能遇到的bug,再最终进行发布。
测试阶段
- 首先选择干净的python的环境,不能是conda环境,可直接下载对应版本的python.exe安装到电脑
- 接着在干净的python环境中配置运行该py文件所需的各种包,像tensorflow、torch等
- 然后采用pyinstaller xxx.py -F命令对该py文件进行打包,打包生成build、dist文件夹和spec文件。其中build文件夹里面的内容不需要我们去管,查看dist文件夹下面存在一个打包完成的exe文件。
- 接着需要将exe文件移动到与该py文件同级的目录下
- 然后采用cmd控制台运行该exe文件,根据相关的报错情况,解决错误
- 解决完错误后,如果不想采用控制台运行该exe文件,则需要重新进行打包。重新打包前首先需要将build、dist文件夹进行删除
- 接着编辑.spec文件,具体的spec打开后是下面的亚子
- 接着我们需要编辑datas这个目录下面的内容,注意编辑形式是元组的形式,就是一个()括号里面包含你想要打包的资源文件的目录,像我需要同时打包images文件夹下的资源文件,那么我就在datas里面写入(‘images’,‘images’)
- 编辑好spec文件后,为了能够在运行exe文件的时候访问到这个文件夹下面的资源,我们需要再次编辑下相关的代码,具体如下:
def source_path(self,relative_path):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
//在类里面加入这么一个函数,用来访问资源文件中的路径
- 在代码中加入上述的函数后,在你原来调用这个资源文件的代码位置再进行修改,例如
//修改前
self.background_path= './images/icon/placeholder.png'
//修改后
self.background_path = os.path.join(self.source_path('images'),'icon/placeholder.png')
//更改为这种形式进行调用就可以啦
- 上述的操作全部完成后,就可以进行重新打包了
发布阶段
- 接上面的第十一步,重新进行打包,在干净的python环境下运行命令pyinstaller xxx.spec -F
- 上述命令是打包成一个exe文件,具体你想要要打包成什么形式(一个exe采用-F,一个目录采用-D)
- 注意在打包过程中,打包的文件不能超过2G,不然会报一些乱七八糟的错误(这个报错的类型各种都有,可以在pyinstaller的github中的issues下看好多人遇到这个问题),所以如果你是有预训练模型的话,尽量采用测试阶段的做法,修改相应的代码,然后运行exe文件后,将相应的预训练模型放置到相应的目录下面就可以直接访问了,windows下在C:\用户\xxx\AppData\Temp\Local目录下,运行exe文件后,看你这个exe文件具体在哪个缓存文件夹下,你直接将预训练模型放过去就可以了
linux平台打包
流程
- 流程也是分为测试阶段和发布阶段,具体的操作方法其实和windows的操作流程一模一样,不过最后打包形成的不是exe文件,这个应该大家都知道。运行可执行文件的方法就是直接./dist/xxx就可以了
- 同样的,打包的文件不能超过2G,不然会报乱七八糟的错,譬如
struct.error: ‘i’ format requires -2147483648 <= number <= 2147483647