目录
前言
用python写可视化工具的时候,并不是所有人都有相关的环境,这就需要给部分使用的人去打成可执行文件exe,这里面需要用到pyinstaller第三方库
官方文档地址
- https://pyinstaller.org/en/stable/usage.html
英语好的可以直接看文档了,没有中间商
什么是pyinstaller
PyInstaller是python的第三方库
PyInstaller可以读取Python脚本,解析脚本执行依赖的所有模块和库,然后收集所有这些文件的副本,包括活动的Python解释器,并将它们与python脚本放在一个文件夹中,或者编译成一个可执行文件
pyinstaller的安装
安装
- pip安装
pip install pyinstaller
- 更新版本
pip install --upgrade pyinstaller
- 从github上安装开发版本
pip install https://github.com/pyinstaller/pyinstaller/tarball/develop
安装没什么好说的,直接用pip安装pyinstaller就可以了,这里有一点注意,博主环境是python3.7,python2好像有点问题,安装失败可以考虑下是不是python版本问题,安装完后,我们可以切到python的scripts目录下执行pyinstaller,如上图所示,就是安装成功了,并且可以看到相关的命令
使用Pyinstaller
- python脚本
import tkinter
top = tkinter.Tk()
top.mainloop()
- 打包命令
pyinstaller main.py
- 显示效果
最基本的命令,main.py脚本用tkinter生成了一个最简单的弹窗,在执行命令时会做一下几个操作:
- 生成.spec文件
会在main.py同级目录生成main.spec文件,spec文件包含了很多打包信息和参数,可以执行被用来执行打包命令,详细在后面
- 生成build文件
若mian.py统计目录下build文件不存在,则会生成一个,在文件中写入一些日志文件和工作文件build,该文件存在会提高打包效率
- 生成dist文件
若mian.py统计目录下dist文件不存在,则会生成一个,会在文件下生成main的可以执行文件exe和一些依赖库
pyinstaller打包常用的命令
生成
- -D
pyinstaller -D main.py
和pyinstaller main.py作用一样,会在dist下生成一个目录,包含依赖库和可执行文件exe
- -F
pyinstaller -F main.py
在dist下生成一个单一的执行文件exe
- -specpath
pyinstaller -specpath spec main.py
给生成的spec文件设置一个路径,不设定的话就是生成在main.py的同级目录下
- -n
pyinstaller -n main2 main.py
给生成的exe文件设置名字,默认就是和脚本同名
打包资源和搜索
- –add-data <SRC;DEST or SRC:DEST>
pyinstaller --add-data res:res2 main.py
将SRC资源路径打进包内,打进包的路径是DEST
- –add-binary <SRC;DEST or SRC:DEST>
pyinstaller --add-data /lib/test.dll;. main.py
同add-data类型,add-binary用在dll等文件的打包,后边用.指的是放在最外层目录
- -p DIR
pyinstaller -p D:\Lib main.py
添加打包是的搜索路径,就是在打包的时候在设定的搜索目录下寻找第三方依赖文件,建议用到外部库的都粘到目录下,这功能感觉比较鸡肋啊,基本用不到
- –hidden-import
pyinstaller --hidden-import messagebox._win32 main.py
官方的解释是可以导入一些隐式调用的包,博主在碰到过得情况是打包后依然会显示缺少某些模块,比如打包win32窗体的应用时,会显示ImportError: No module named ‘win32’,这个时候就用到了上述代码
- –collect-submodules MODULENAME
pyinstaller --collect-submodules C:\Python37\Scripts main.py
跟–hidden-import 作用相同,不过这里是指定目录,不是直接指定包名
- –collect-data MODULENAME
pyinstaller --collect-data C:\Python37\Scripts main.py
在指定目录下搜索文件
- –collect-binaries MODULENAME
pyinstaller --collect-binaries C:\Python37\Scripts main.py
在指定目录下搜索数据文件
- –collect-all MODULENAME
pyinstaller --collect-binaries C:\Python37\Scripts main.py
在指定目录下搜索所有文件
- –copy-metadata PACKAGENAME
pyinstaller --copy-metadata pyqt5_plugins main.py
只拷贝指定模块的元数据到包内
- –recursive-copy-metadata PACKAGENAME
pyinstaller --recursive-copy-metadata pyqt5_plugins main.py
复制指定包及其所有依赖项的元数据,相比–copy-metadata,复制了其依赖项的数据
- –additional-hooks-dir HOOKSPATH
转载:https://zhuanlan.zhihu.com/p/37764866
就是在打包的时候添加一些会被特定触发的钩子文件,和git的hook类似,博主没用过这个,引用一篇文章可以参考一下(这些hook的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑)
- –runtime-hook RUNTIME_HOOKS
自定义运行时挂钩文件的路径。运行时挂钩是与可执行文件捆绑在一起的代码,在任何其他代码或模块之前执行以设置运行时环境的特殊功能。此选项可以多次使用
–exclude-module EXCLUDES
pyinstaller --exclude-module tkinter main.py
忽略某些包或者模块,不拷贝进包里,如上述命令,tkinter相关的包和依赖就不会被拷贝
- –key KEY
用于加密 Python 字节码的密钥
–splash IMAGE_FILE
pyinstaller --splash "C:\Users\Administrator\Desktop\start.png" main.py
加闪屏动画的,就是应用启动时的图像
其他命令
- -w
pyinstaller -F -w main.py
windwos上执行打包后,运行exe文件会有一个cmd的命令行输出框,看着很不优雅,-w命令可以去掉
- -i
pyinstaller -i C:\Users\Administrator\Desktop\icon.png main.py
给打包出来的exe设置icon
spec文件打包exe
我们之前一直都在用各种命令去打包exe,其实还有个相对简单点的方式去打包,就是利用生成的spec文件,如下所示:
pyinstaller main.spec
不用加任何-F,-D的指令,上述命令可以按照上次打包时的指令生成exe,spec文件存的就是上次打包时的命令
pyinstaller main.py -i C:\Users\Administrator\Desktop\icon.png --hidden-import messagebox._win32
每次在执行python脚本打包的时候,所用的命令,就会生成对应的spec文件,如上述命令和spec展示所示,如此我们可以直接在spec文件内配置,就不用每次打包输入繁琐的指令了
pycharm设置快捷打包
file——>Settings——>Tools——>External Tools
在pycharm中我们可以设置快捷键打包
- Name:名字
- Program:这里指向你python目录下的python.exe可执行文件
- Arguments:$ FileNameWithoutExtension $.spec(记得去空格)
- working directory:$ FileDir $(记得去空格)
点击左上角+号,在弹出面板填入参数,Arguments是具体的指令,这里是只执行一个spec文件,你也可以设置具体的指令 -F -w F i l e File File.py,这样的
pyqt5打包后图片不显示
在用pyqt5制作应用的时候,发现一个问题,打包进应用里的图片不能正常显示,找了半天也没找原因,查了一下,发现有万能的网页提供了相关的解决思路,试了一下没问题
解决思路
1、读取图片字节流,用base64编码
2、将编码后的数据存到一个python文件内
3、在代码内,import这个py脚本
图片写入qrc文件
<RCC>
<qresource prefix="/">
<file>res/select.png</file>
<file>res/u_s.png</file>
</qresource>
</RCC>
首先创建一个qrc文件,然后把图片信息都写进去
做个快捷执行命令
- Name:名字
- Program:这里指向你python目录下的pyrcc5.exe可执行文件
- Arguments: F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension_rc.py
- working directory: F i l e D i r FileDir FileDir
这里用pyrcc5直接去把qrc文件转成py文件,pyrcc5模块,装了pyqt5就也装好了,找一下你自己的目录就行
图片转换
在qrc文件下直接右键选择刚才做好的快捷命令,然后就可以在统计目录下生成一个py文件
引用py显示图片
import images_rc
tempBtn.setIcon(QIcon(QPixmap(':/res/select.png')))
在显示图片的脚本里引用刚生成的py文件,就可以想平常一样显示图片了,但是这里加载图片需要多些一个冒号
推送
- Github
https://github.com/KingSun5
结语
若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
本文属于原创文章,转载请著名作者出处并置顶!!