(请先看置顶博文)本博打开方式,请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净
最近用Python开发了一个可视化界面,开发过程如鱼得水,几乎没有BUG出现(项目简单)。但是在临近交付时发现,打包这个项目有点令人发愁。不过,一切难题最终被我“斩于马下”(踩过众多坑的我,今天就给大家重现一下我是怎么掉进坑里的!)
为了方便大家阅读,我先介绍打包过程,然后再介绍我出现的问题和打包心得:
能看到这篇博问的同学想必是通过百度搜索pyinstaller如何打包Python项目、Python程序、Pyqt5程序进来的,那么我们就不多介绍pyinstaller这个打包程序了。在这次打包过程中,我使用的pyinstaller版本为4.0,而不是最新的4.1版本(实践过程中觉得pyinstaller4.1版本有坑,天坑!)
使用Terminal或者在Setting->Project Interpreter添加:
1、 Terminal方法:需要输入的命令行如下所示
pip install pyinstaller==4.0
2、Setting->Project Interpreter中设置
主程序就是指明整个项目是从哪开始运行的程序,尤其是包含下图代码的,那一定是主程序了(你自己写的代码,主程序是哪个py文件你还不知道?)。那么就有好奇宝宝问了,我自己的主程序在原来位置好好的,为什么还需要复制到项目文件的Lib路径下?这是因为Lib文件下的site-packages里有我们的pyinstaller,我们在使用该工具时,得让他找的到我们要打包的程序。如下图所示,我已经把main_code.py复制到Lib文件夹里了。(是Lib文件夹,不是Lib、site-packages)如果你为自己的程序设计了图标,同样的道理,把图标文件(****.ico)也要复制到Lib文件目录下。
打开Pycharm的Terminal,并进入到lib目录下,使用的命令为:“cd lib”,如下图所示:
接下来,开始我们的打包,需要的打包命令有两种,分别有不同的效果,建议大家按照我介绍的顺序都用一下,先介绍第一种,其中有-D和-i选项,:
pyinstaller -D main_code.py -i cat.ico
-D:打包 Python 程序为一个文件夹
-i:生成图标,只适用于 Windows 平台(没有图标就不用加“-i cat.ico”)
使用这个打包命令打包好的程序在运行时会出现“窗口控制台”黑框,如下图所示。如果你的代码无法正常运行(在Pycharm里可以运行,不代表打包后的exe程序可以流畅运行),窗口控制台就会出现错误提示,也相当于一个DeBug的过程。所以,在此我建议打包程序的同学,先运行这个命令,等到一切正常后,再使用第二类“命令”。值得注意的是,如果打包好的程序无法顺利运行,这个黑框就会一闪而过,我们根本看不清错误提示。我也遇到了这个问题,我使用录频软件,录制了整个过程,放慢速度后才看清错误提示,最终解决了BUG。以下是打包命令从输入到打包成功的Terminal截图,由于项目路径不同,所以仅供参考!打包完成后,有一些程序需要读取的文件比如Excel文件、图片等,一定要把这些文件全部复制到“dist\main_code”文件里。我打包好的exe程序位置是“\Lib\dist\main_code\main_code.exe”,所以我将程序所需要的文件都放在了和“main_code.exe”相同的目录下。大家可以以我为例,对照着操作。对了,我使用的是相对路径。另外,如果按照我介绍的步骤进行打包,就不要再参考其他的资料或者书籍了,防止不兼容。
第二种命令:
pyinstaller --noconsole -D main_code.py -i cat.ico
其中--noconsole就是取消“窗口控制台”黑框的命令选项,这个命令是等到程序一切正常后才使用的。所以我先前就说了,一定要按照我介绍的顺序打包两次,这样才可以保证打包的成功率。下图是使用第二种命令打包成果的Terminal截图。
同理,也需要将exe程序所需要的图片、excel等文件复制到和exe同样的目录下。
出现问题的模块或包为:Pyqt5、pyinstaller、sumpy。在主程序开头,我已将上述中的二者导入(pyinstaller是打包工具,不是环境),但是在运行时,总是报错,其中就包含numpy1.19.4。如果你也出现与numpy相关的报错信息并且环境恰好是1.19.4的版本,那么我建议你使用如下命令降低numpy版本。
先卸载原先的1.19.4版本,在Terminal里输入以下命令:
pip uninstall numpy==1.19.4
随后安装低版本 1.19.3
pip install numpy==1.19.3
或者也可以在Pycharm的Setting里修改,用减号移除包,用加号增加所要的包。如下图1、图2所示,可进行包的增删以及包版本的选择。
图 1
图 2
Pyqt5也出现了问题,我仿照numpy的处理方式降低了版本,打包程序就运行的顺畅多了。pyinstaller也是同样的道理。
我使用的编辑器是Pycharm,运行代码时没有任何问题,打包也打包成功了,就是在运行exe文件时提示“exit”没有声明。我反复观察代码,后来是发现代码里有一处使用“exit”不规范导致的,更改后,重新打包,exe程序成功运行!所以就如我上面说的,编译器不报错,不代表打包成功后的程序能顺利运行。
上文也提到,在打包完成后,要把相关文件全部放入与可运行程序同一目录文件夹下,如果你依赖的文件在打包之前就在一个文件夹A里,那么把A复制,粘贴到与exe程序同一文件夹“dist”内。与路径相关的还有在编写代码时使用的是相对路径还是绝对路径,我这里使用的是相对路径。
打包主程序即可,打包软件自动会把依赖的模块或包打包进去,比如我在此次开发过程中用了Pyqt5。pyinstaller打包main_code.py时,自动将Pyqt5等模块打包进去,无需我们一一指定。
在踩坑过程中,我试验了百度、CSDN上能查到的各种方法,不同情况使用的命令不同,程序所需文件复制到的位置也不同,大脑一片混乱。我在打包过程中还在思索,就一个简简单单的打包过程为啥这么复杂,网上教程为何都不适用,但是功夫不负有心人,我最终打包成功!所以,大家千万不要像我一样(东拼西凑),静下心来,把我这篇文章看完,一步一步去打包。打包成功了“收藏、关注、点赞、转发”,打包不成功,你私信我,我尽量帮助你解决问题。
最后附上我使用Python模块的版本搭配,希望对大家起到一个参考的作用。