pyinstaller打包exe应用程序详细教程

1、PyInstaller简介

PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大主流平台,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,从而允许最终用户在无需安装 Python 的情况下执行应用程序。
PyInstaller 制作出来的执行文件并不是跨平台的,如果需要为不同平台打包,就要在相应平台上运行PyInstaller进行打包。

2、安装anaconda,并在anaconda prompt上进行pyinstaller的安装,安装指令如下:

pip install Pyinstaller

3、需要准备的文件如下:

pyinstaller打包exe应用程序详细教程_第1张图片

我们的ZMZ_test文件夹放在c盘的桌面

广大校徽.ico 是生成可执行文件的图标

gui2.py 是python文件,是需要打包的文件

4、使用Pyinstaller

打开anaconda prompt,切换到项目目录,目录如下图所示:

pyinstaller打包exe应用程序详细教程_第2张图片

 一定要切换到项目目录再执行打包命令,否则生成的文件将会在别的目录,以至于你找不到需要的文件。

输入命令进行打包,输入的命令为

pyinstaller -F -i 广大校徽.ico gui2.py --add-data "C:\Users\lenovo\Desktop\ZMZ_test\epoch200.pth.tar;."

pyinstaller打包exe应用程序详细教程_第3张图片

稍等片刻后看到successfully说明就是成功了,打包成功后生成以下文件,exe可执行文件在dist文件夹上。

pyinstaller打包exe应用程序详细教程_第4张图片

双击exe文件即可看到我们需要的gui界面。 

5、涉及到的参数介绍

pyinstaller打包exe应用程序详细教程_第5张图片

6、遇坑与填坑

6.1、纯Python代码的打包

如果你的软件中只有.py文件,即Python代码文件,不包括图标、图片等资源文件,那么使用pyinstaller打包是非常简单的,往往只需要下面一行命令即可:

pyinstaller -F -i 广大校徽.ico gui2.py

当运行这个命令之后,会对应的生成一个gui2.spec文件,这个文件之后有用处。

其中的几个选项:
-F 把整个软件(包括依赖的各种库文件)打包成单一文件;也可以用-D代替,-D是生成一个文件夹,把所有的依赖项放入文件夹中
-i 生成的exe文件会带有这个图标;
最后的gui2.py就是翻译软件的入口程序

但其实这里面打包ZMZ_test项目有个坑,项目一般都会用到一些插件,诸如ZMZ_test-html等,这些模块在pyinstaller打包过程中并不会自动导入,因此需要手动在spec文件中手动写入。

一般来说,ZMZ_test项目按照如下方式修改即可:

- numpy等可以根据实际情况看是否加入,主要是pytest相关的安装包

- C:/Python38/Lib/site-packages 路径请替换成自己的本地python路径
 

a = Analysis(
    ['main_for_xxx.py',],
    pathex=[],
    binaries=[],
    datas=[('C:/Python38/Lib/site-packages/pytest_html', './pytest_html'),
           ('C:/python38/Lib/site-packages/pytest_html-3.1.1.dist-info', './pytest_html-3.1.1.dist-info'),
           ('C:/Python38/Lib/site-packages/py', './py'),
           ('C:/Python38/Lib/site-packages/pytest', './pytest'),
           ('C:/Python38/Lib/site-packages/_pytest', './_pytest'),
           ('C:/Python38/Lib/site-packages/pytest_assume', './pytest_assume'),
           ('C:/python38/Lib/site-packages/pytest_assume-2.4.3.dist-info', './pytest_assume-2.4.3.dist-info'),
           ('C:/Python38/Lib/site-packages/pytest_metadata', './pytest_metadata'),
           ('C:/python38/Lib/site-packages/pytest_metadata-2.0.1.dist-info','./pytest_metadata-2.0.1.dist-info'),
           ('C:/Python38/Lib/site-packages/numpy', './numpy'),
           ('C:/python38/Lib/site-packages/numpy-1.22.3.dist-info', './numpy-1.22.3.dist-info'),],

其中,datas增加的内容实际上和pyinstaller --add-data命令起到的作用一样,以('C:/Python38/Lib/site-packages/ZMZ_test_html', './ZMZ_test_html')为例,元组第一个参数代表本地python site-packages库中的ZMZ_test_html文件夹,'./ZMZ_test_html' 代表pytest将该文件夹打包后存放的路径,相同的用add-data命令如下:--add-data="源地址;目标地址"

pyinstaller main_for_xxx.py --add-data "C:/Python38/Lib/site-packages/pytest_html ;./pytest_html"

6.2、包含其他文件的打包

其实原理与之前说的在datas中添加资源文件类似,但是需要注意的事项多了一些。

由于我的gui2.py里面包含了文件epoch200.pth.tar,因此,需要在输入命令时加入--add-data的命令。该命令为:

--add-data "C:\Users\lenovo\Desktop\ZMZ_test\epoch200.pth.tar;."

pyinstaller打包exe应用程序详细教程_第6张图片

pyinstaller打包exe应用程序详细教程_第7张图片

 如果不添加这个命令,则在运行exe文件时,会报错找不到相关的文件,报错内容为:

pyinstaller打包exe应用程序详细教程_第8张图片

 另外,说几个重要的注意事项:

1.命令使用pyinstaller和pyinstaller.exe结果都是一样的

2.-w是不显示命令窗口,  -i 图标文件的路径  这是改变图标的,但是我发现只能改变任务栏里的和命令窗口的图标,并不能改变exe文件的图标。另外这些参数要加载pyinstaller和路径中间。

3.有一些代码需要调用一些图片和资源文件的,这是不会自动导入的,需要你自己手动复制进去才行。不然exe文件运行时命令窗口会报错找不到这个文件。

4.也是最坑的一点。就是当你使用错误的参数去打包或者打包到一半中断,等等此类运行到一半没了的情况。会导致你原来的py文件变成一个0KB的空文件。里面的代码会全部消失!!!所以以后需要有个良好的习惯,就是复制一份代码出来,用这个副本进行打包。并且参数出错,或者打错了导致失败时,检查下副本文件的py文件是否还存在再继续重新打包,不然打出来的就是空的文件,自然一直闪退,因为压根没内容。

5.写代码的时候应当有个良好的习惯,用什么函数导什么函数,不要上来import整个库,最后你会发现你一个100KB的代码打包出来有500MB,全是库,简直无语

6.pygame代码调试的时候要用quit()不然程序结束时会崩溃。但是直接运行py文件就不需要这个函数。这个我们之前的文章也提到过了。但是这里当我使用-w做成无窗口的程序后,一结束发现报错,暂停后发现报的是找不到quit()函数。可见这个函数其实是一个很让人无语的函数。一方面pygame官方网上说结束程序的时候需要加入这个函数。另一方面其实在正在运行时都不需要甚至会报错。虽然也不影响运行,但是弹个窗口出来说 什么不fail to execute总是让别人觉得你是个lowb。所以,调试的时候加一下,到时候execute的时候去掉。

你可能感兴趣的:(python,pycharm,开发语言)