本次我想打包的是hand-write-main的项目作为例子!
当你想要打包的项目成exe文件与其他项目使用同一虚拟环境时,建议重新生成一个虚拟环境。
像我这里许多项目都是公用一个叫pytorch_gpu的虚拟环境,里面包含各种第三方库。在这样的虚拟环境打包想要的exe文件,会造成exe很大可能达到100多Mb.
像这样把项目直接整体复制过来 我们就可以重新建一个虚拟环境我们就起名handwrite吧,再打包就能解决打包速度慢、占用空间大以及其他可能会造成冲突的问题。
我们需要在新环境handwrite中安装pyinstaller 一定要装 (命令是pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller)以及我们项目的所需要的第三方库。 像我这个新环境就很干净。
一定要装的原因解释是:使用pyinstaller打包代码时,如果一个代码是运行在conda环境下,而使用的是系统中安装的pyinstaller时,pyinstaller可以运行,但是此时打包时调用的库是系统的库,如果系统库中没有对应包,就会出现报错,此时需要在打包的conda环境下也安装pyinstaller,使用指定conda环境下的pyinstaller打包。
安装好我们环境需要所有第三方库和pyinstallrt后 就可以开始打包我们的exe文件了!
一般使用命令为 pyinstaller -F -w xxxx.py
打包成功就会项目文件夹里就会多出上图两个文件夹,其中的exe就是我们想要的文件。
下面是我打包过程中遇到的坑:
1.缺少模块,像下面的情形
解决方法一:
通过 --add-data 也可以添加模块包,比如
pyinstaller -F -w --add-data="D:\datasets1;main\datasets1\." --add-data="D:\datasets2;main\datasets2\." xxx.py
这样就可以把d盘的datasets1和datasets2两个文件夹添加到我们的exe文件中,python中引用的相对路径为 main\datasets1\和main\datasets2\
其中:
-F 表示生成单个可执行文件
-w 表示去掉控制台窗口,这在GUI界面时非常有用。
--add-data 表示添加资源文件,参数为 "源地址;目标地址"
xxx.py 为 py文件名
解决方法二:
我们可以使用命令 pyinstaller xxx.py 来打包 这样只生成一个dist的文件夹.你可以进去检查里面是否包含你项目的所有第三方库。如果缺少那个模块我们可以去虚拟环境里面手动复制放到文件夹里面。加入我们缺少PyQt6模块!我们就可以到下面的路径找。
直接整个文件夹复制到我们的dist中。
这样就完美解决!!!!