一、pyinstaller是什么?
pyinstaller是一款专门用于打包编译python脚本的工具。在使用时,pyinstaller将python应用程序及其所依赖的库捆绑到一个包中,用户可以运行打包的应用程序,而无需安装python解释器或任何模块。
二、pyinstaller的使用
1.安装pyinstaller
由于pyinstaller安装需要很多依赖库,而其又是可以通过PyPI安装的,因此一般建议使用pip安装。
pip install pyinstaller
通常安装过程会十分顺利,当下载速度过慢时,可以使用清华镜像源进行安装:
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
2.编译过程
pyinstaller读取编写好的python脚本,它会分析脚本源码,发现脚本执行所需的所有其他模块和库,然后它收集所有这些文件的副本,包括活动的python解释器,然后将它们与脚本一起放在单个文件夹中,或者可以选择放在单个可执行文件中。
例如,我们要将call.py这个文件编译成为二进制文件,其运行过程如下:
pyinstaller call.py
运行结束后,会在当前目录下生成build和dist两个文件夹。其中,log日志文件和工作文件会存放到build目录下,而call.py生成的.exe文件会存放到dist文件夹中。
3.主要选项
在进行编译时,有许多选项供我们选择,最常用的
选项 | 功能 |
---|---|
-h,–help | 查看该模块的帮助信息 |
-F,-onefile | 产生单个的可执行文件 |
-D,–onedir | 产生一个目录(包含多个文件)作为可执行程序 |
-w,–windowed,–noconsolc | 指定程序运行时不显示命令行窗口(仅对 Windows 有效) |
-c,–nowindowed,–console | 指定使用命令行窗口运行程序(仅对 Windows 有效) |
-o DIR,–out=DIR | 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件 |
-n NAME,–name=NAME | 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字 |
更多详细选项可以参考文章点击这里。
三、使用过程中遇到的问题
1.个人配置
下面是我在进行编译时目录中的.py文件:
其中,call是要进行编译的函数,但其没有实质性的窗口或方法,其作用是实例化主窗口以及子窗口并对他们分别进行调用,.ui文件使用pyqt5制作的,共有三个,首先是入口主窗口,其次是两个功能性的子窗口,而两个子窗口用到的所有方法与函数都放在image_processing.py文件中,所以在进行编译时要用到的.py文件总共五个,分别是call.py、begin.py、cut.py、change_pic.py和img_processing.py。
2.编译时的问题
在进行编译时,首先我使用的是
pyinstaller -F -w call.py
不出意外的失败了,生成的dist文件夹中并没有exe可执行文件。
随后,我在网上找了很多关于我这种多文件打包的文章,最终在这篇文章中找到和我类似的解决的办法。
多个.py文件打包命令格式如下:
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2]
以我的为例:
其中call.py是主程序入口文件,其他.py文件是自建模块,需要在主文件中使用。其代码为:
pyinstaller -F -w call.py -p begin.py -p cut.py -p change_pic.py -p img_processing.py --hidden-import begin --hidden-import cut --hidden-import change_pic --hidden-import img_processing
随后,顺利生成.exe可执行文件并能够成功运行。但其大小足足有460MB。因此,考虑编译时使用的环境是我的初试环境,里面安装了许多不必要的包,所以我新建了一个环境,仅安装程序需要的包。
——————————————————
都调试好以后,再运行上述的代码,却发现报错了,于是重新运行第一步的:
pyinstaller -F -w call.py
最后成功生成.exe文件并运行成功,且.exe文件成功缩小到100MB。
总结
1、在使用pyinstaller生成.exe文件前,最好新建一个环境,并只安装该程序需要的库即可,当环境中安装过多的库时可能会导致程序生成失败。
2、多个程序使用pyinstaller生成.exe文件时,推荐首选第一种方法,即只对主程序入口文件进行生成。当第一种方法失败是,可以使用第二种方法对多个.py文件生成。