如何将带依赖的Python Tkinter应用打包为可分发可执行文件?
Python Tkinter应用打包为跨平台单可执行文件实操指南
直接用PyInstaller就行,是目前对新手最友好的Python打包工具,自动处理numpy、cython这类带C扩展的依赖,不需要用户提前装Python或者任何第三方库,完全满足你Windows双击启动、Linux跑单文件的需求。
前置准备
- 先在开发环境把所有依赖装全,跑通
python main.py,把所有功能测一遍确认没有本地运行的bug,再开始打包 - 终端执行
pip install pyinstaller安装工具,不用折腾其他冷门打包工具,新手踩坑了都找不到解决方案 - 注意:Windows的安装包必须在Windows系统下打包,Linux的可执行文件必须在Linux系统下打包,跨系统打包生成的文件100%跑不了,别信什么一键跨平台打包的花活,对应系统打对应包是最稳的。
基础打包命令(直接生成单文件)
进入你项目存放main.py的文件夹,打开终端执行对应命令即可:
通用单文件打包命令
pyinstaller -F -w main.py
参数解释:
-F:所有依赖、代码、资源全部打包进单个独立可执行文件,Windows下生成后缀为.exe的程序,Linux下生成无后缀的可执行程序,不用带一堆零散文件-w:GUI程序专用参数,启动时不会弹出黑色的命令行终端窗口,避免用户点开程序先看到个黑框的违和感;如果是Linux下需要看终端日志调试,可以暂时去掉这个参数
命令执行完后,项目目录下会自动生成build、dist两个文件夹和一个spec配置文件,你需要的最终可执行文件就在dist目录里:
- Windows环境下拿到的
main.exe,直接发给普通用户,双击就能启动 - Linux环境下拿到的
main文件,先给它加执行权限(右键属性勾选“允许作为程序执行”,或者终端跑chmod +x main),之后双击或者终端执行./main就能启动
高频踩坑解决方案(你用numpy、cython大概率会碰到)
- 如果打包后运行提示找不到numpy、cython相关模块,就在打包命令后面追加
--hidden-import 缺失的模块名,比如缺numpy核心模块就加--hidden-import numpy.core._dtype_ctypes,PyInstaller对部分C扩展库的导入关系扫描不全,缺啥补啥就行 - 如果程序用到图标、图片、配置文件这类外部资源,打包时要加
--add-data参数把资源打进去:Windows下路径分隔用分号,格式为--add-data "本地资源路径;包内路径";Linux下路径分隔用冒号,格式为--add-data "本地资源路径:包内路径"。同时代码里读资源不要写死相对路径,要做运行路径适配,不然打包后会找不到资源 - 打出来的包体积太大(带numpy的程序一般会在100M上下)是正常的,想缩体积就新建个虚拟环境,只装你程序实际用到的依赖再打包,不要用装了一堆杂七杂八库的全局Python环境打包,体积能缩30%-50%
- tkinter是Python标准库自带的,只要你本地开发环境运行tkinter不报错,PyInstaller会自动把相关文件打进去,不用额外处理
新手避坑提醒
- 第一次打包别上来就折腾Nuitka、cx_Freeze、py2exe这类其他工具,PyInstaller的用户基数最大,遇到问题搜一下基本都有现成的解决方案,对首次做GUI分发的学生来说学习成本最低
- 先跑通最基础的打包命令,生成能正常运行的单文件之后,再慢慢调整图标、精简体积、加资源,别一开始就对着spec文件写一堆复杂配置,容易卡半天出不来可用的包
- 打完包一定要找个没装过Python、没装过你项目依赖的干净电脑/虚拟机测一遍,别在自己开发机上能跑就直接发给用户,很容易漏依赖导致用户点开就报错
内容的提问来源于stack exchange,提问作者RtxTrillihin
相关产品推荐
相关产品推荐

