在打包之前,你需要安装pyinstaller,如果你是使用的虚拟环境,在打包前需要在命令行里激活你安装了pyinstaller的那个虚拟环境

在使用pyinstaller打包python程序的时候大概分为两种请况:

1.要打包的程序为单个py文件:

这种情况来说一般你的程序比较小(代码比较少),这个时候直接进入到你的要打包的py文件的目录下(或者不进入,直接在pyinstalller命令后输入你这个py文件的地址),使用如下命令:

pyinstaller test.py

一般来说如果你的程序只是一些小脚本,没用什么大型的或者是稀有的库的话这样做就够了,等到出现

175392 INFO: Building COLLECT COLLECT-00.toc completed successfully.这一行后就说明打包成功了,这个时候会在你的项目目录下成dist和built这两个文件夹,其中built这个文件是pyinstaller打包时临时生成的可以删除, 打包完的exe文件在dist目录下,你只需将dist下所有的文件一起拷贝到别人电脑上就可以用了

2.要打包的文件为多个py文件

这种情况一般你的代码较多,项目较大,可能你写了一个GUI界面py文件这个文件调用了其他文件的函数什么的,这个时候你需要生成spec文件来打包,这里假设你的要打包的主文件为test.py,首先在命令行中,cd到项目的相对目录下,然后输入:

pyi-makespec test.py

之后会在你的当前目录下生成一个test.spec,你可以在pycharm中打开这个文件,里面的内容大概是这样的

python闪退py python运行py文件闪退_打包

你需要把你的除了主文件以外的其他py文件也写到 a = Analysis(['GUI.py'],   的这个列表中,像这样

Analysis(['GUI.py', 'test1.py', 'E:\\a\\test2.py']

如果你的其他py文件和你要打包的主文件test.py不在同一个目录,那么你在list中需要输入这个py文件的绝对地址

如果你的项目调用了一些图片、dll等二进制文件,你也需要将他们打包进去,不然程序无法正常运行,你可以在spec文件中的

datas这个list中添加,方法和上面那个一样,不过最好填绝对地址,也可以等你项目打包完了在copy到你的那个exe文件的目录下

(这个种情况,你在程序中调用这些资源的时候最好用相对地址,不然程序到了别人电脑上就找不到地址了),大致只需要配置这些东西啦,其他东西都不是必须的。

然后在刚刚的命令行中输入:pyinstaller -D test.spec 就开始打包了,在这里-D是打包成一个文件夹,-F是打包成一整个文件(传说打包成一整个文件打包缓慢,容易出错,因此不推荐使用,我也没试过)

-D, --onedir

Create a one-folder bundle containing an executable (default)

-F, --onefile

Create a one-file bundled executable.

同理打包完成后可以在dist目录下找到打包好的exe文件。

可能遇到的问题:

闪退

最常见的问题就是闪退,这种错误让人最烦,因为报错都没看到就结束了,想解决都无从下手,之前我还想过用qq截图,当他报错的一瞬间按下截图快捷键,对手速的要求极高,十分考验程序猿的年龄、婚否等等综合素质,然后2分钟后我想了一个简单的方法,首先打开命令行,然后再命令行中输入你的exe文件的地址,像这样:

python闪退py python运行py文件闪退_闪退_02

然后按回车,这样这个程序会依赖于你的这个命令行的窗口来执行(像容器一样),这样就可以看到报错信息啦!欧!这真的是太酷炫了!

Not found

出现这种情况的原因是你在执行你的exe文件的时候遇到了错误,而错误的原因一般有两种找不到

第一种找不到是环境找不到:假如你的项目里面用了tensorflow等大型的库,那么你在打包完后可能会出现tensorflow的某个东西找不到的情况,这个时候你去你的python的环境下,比如anaconda的是这样的D:\Anaconda\envs\dl\Lib\site-packages(因该在你的python环境下的Lib\site-packages目录下),里面有你这个环境的所有库,这个时候,你只需要把这个目录下的tensorflow的文件夹整个copy到你的exe文件的那个目录下就行了,需要注意的是这样做会把整个库都打包过去,然后造成你的打包后的文件巨大无比,虽然可能你只是用了里面的某一个函数,按道理来说你是可以只把你用的那个函数打包进去就好,但是你需要确保你的路径没问题,对于新手来说这是一个复杂的工作,我没有试过,理论上是可行的,还有一个方法是在代码里尽量使用from ... import ...而不是直接import(比如from os.path import join而不是 import os然后os.path.join这样调用),因为直接import会把那个库都打包进去,而from ...import ... 只会打包那个函数(事实上我试过这种方法,但其实这样做并没有减小我的环境大小,不过大家都说这样可以,也许只是我代码没写好呢)

第二种找不到就是资源找不到,像你代码里面需要的图像,视频等等资源文件没找到,首先确保你在你代码中调用这些资源的地址是相对地址,然后看那个地址和你那个资源的地址是否一致,没有的话就copy到那个地址就好了,一般来说这种问题不会太难

打包成功可以运行,但是功能错乱

这个问题真的是我遇到的最让人无语的一个错误

我在pycharm里面调试没有问题,但是打包之后按自己写的GUI的按钮出现了功能错乱的情况,我以为是我的pyinstaller出了问题

然后我把它卸了重装了N次,换了N个版本,还是没有解决,然后我换了台电脑解决了,出现这个问题的原因应该是我的环境出问题了,这个时候我推荐你重新配一个新的项目环境,然后重新打包一次,事实上,在装环境的时候不同的库的安装顺序对环境是有影响的,又也许我在copy那些库文件的时候不小心把环境玩坏了,出现这个奇葩的bug网上都找不到第二个。

其他问题

其他问题直接复制了百度就行了,一下子就能找到答案

如有什么不对的地方希望各位多多指正,有什么不懂的地方也可以在下方评论。

附上萝莉一枚

python闪退py python运行py文件闪退_python闪退py_03