暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python项目如何打包成exe文件

程序员杨叔 2024-12-04
213

一、背景

在开发Python应用程序的过程中,我们可能会遇到需要将Python项目或脚本打包成一个独立的可执行文件的情况,以便于在其他电脑上快速运行,或者在其他没有安装Python环境的机器上运行。

此外,有时候我们写了一个小工具,也可能会需要打包为exe文件方便其他人通过exe文件直接双击运行工具。这时候,PyInstaller 就是一个非常实用的工具了,pyinstaller是一个第三方模块,专用于python程序的exe打包。

pyinstaller的官网是:https://pyinstaller.org/

二、安装

首先,你需要确保你的环境中已经安装了 PyInstaller。如果还没有安装,可以通过 pip 命令轻松安装:

    pip install pyinstaller

    三、开始打包

    3.1 常用打包命令总结如下:

    • pyinstaller xxx.py 打包成一个文件夹

    • pyinstaller -F xxx.py 打包一个exe文件,双击exe文件运行,默认会弹出Windows控制台窗口运行(仅对 Windows 有效)

    • pyinstaller -F -w xxx.py 打包一个不带控制台的exe

    • pyinstaller -F -c xxx.py 指定为打包成一个带Windows控制台窗口的exe

    • pyinstaller -F -i xxx.ico xxx.py 打包一个指定图标的exe

    3.2 执行打包命令

    假设项目的主运行文件叫:lark_manager.py,PyCharm终端执行打包命令:

      pyinstaller -F lark_manager.py



      看到下面的Building EXE successfully则说明打包成功:



      注意:如果运行pyinstaller相关命令报错"The ‘pathlib’ package is an obsolete backport of a standard library package and is incompatible with PyInstaller.",则直接删除掉pathlib库,使用:

        pip uninstall pathlib

        然后再重新使用pyinstaller命令即可。

        四、打包产生的文件

        打包完成后,打包目录下你会发现生成了一些文件,下面我们对每个文件做一些说明:

        4.1 spec文件

        pyinstaller会生成一个spec文件将一些打包参数放到里面:


        以后有代码更新,想重新打包的时候,如果你对 .spec 文件进行了自定义配置,可以直接使用下面的命令打包:

          pyinstaller lark_manager.spec

          如果你没有进行任何自定义配置,可以继续之前的打包命令,但要注意这可能会覆盖之前的 .spec 文件:

            pyinstaller -F lark_manager.spec

            通常来说,稍微复杂一点的项目都会涉及到.spec文件进行自定义配置,.spec文件里面各个条项的含义解释,我们放最后面去说。

            4.2 dist文件夹

            目录下新生成了一个dist文件夹,里面存储了打包后的EXE文件:

            打包完成后的这个exe文件,就是一个独立可运行的文件,不用依赖python环境,可以直接复制这个exe文件到他人的电脑上直接双击运行。

            4.3 build文件夹

            pyinstaller还会生成一个build文件夹,并写入一些打包的日志信息文件:

            五、打包为一个文件夹

            如果是想打包为一个文件夹,则使用:pyinstaller xxx.py 打包后的文件夹中包含一个exe文件,以及其他一些依赖文件,比如dll文件:

            六、定制EXE文件图标

            默认情况下,打包出来的exe文件使用的是下面这种默认的图标:

            如果想生成指定图标的exe文件,先准备好一张.ico的图标文件,将图标文件放至工程根目录下,然后使用命令:

              pyinstaller -F -i xxx.ico xxx.py

              打包一个指定图标的exe,打包后的icon就换成了指定的ico图标:

              注意:如果打包后你发现图标没有变,还是用的默认图标,不要慌。实际上图标已经成功更新了,你可以把新生成的exe文件移动/拷贝到其他路径查看确认,或者发送给别人也可以,就会发现图标是更新后的图标了,原因是Windows的图标缓存导致。

              七、定制启动loading进度条

              如果exe文件内容比较庞大,启动比较慢,需要一个启动页面的话,准备一张.png图片文件(必须是.png格式),将图片文件放至工程根目录下,打包时加上:–splash参数

                pyinstaller -F --splash xxxx.png xxxx.py

                双击exe文件运行后,会发现多了一个弹窗图片显示:

                八、spec文件自定义打包配置

                正常情况下,如果你的项目不只是一个py文件,而是一个大的项目工程,包含很多其他的py文件、配置文件,以及有很多三方的依赖。

                那么想要把这样的一个工程打包为EXE文件,则需要对.spec文件进行相关的自定义配置,这样打包出来的EXE文件才能正常运行。

                以下面的这样的一个spec文件举例,我们来对其中重要的字段做一下简单的说明:

                  # -*- mode: python ; coding: utf-8 -*-


                  a = Analysis(
                  ['lark_manager.py'],
                  pathex=[],
                  binaries=[],
                  datas=[],
                  hiddenimports=['sqlite3'],
                  hookspath=[],
                  hooksconfig={},
                  runtime_hooks=[],
                  excludes=[],
                  noarchive=False,
                  )


                  a.datas += [('Utils/test_case.py', './Utils/test_case.py', 'DATA')]
                  a.datas += [('Utils/util_config.py', './Utils/util_config.py', 'DATA')]


                  a.version = ' v1.0'


                  pyz = PYZ(a.pure)


                  exe = EXE(
                  pyz,
                  a.scripts,
                  a.binaries,
                  a.datas,
                  [],
                  name='lark_manager' + a.version,
                  debug=False,
                  bootloader_ignore_signals=False,
                  strip=False,
                  upx=True,
                  upx_exclude=[],
                  runtime_tmpdir=None,
                  console=False,
                  disable_windowed_traceback=False,
                  argv_emulation=False,
                  target_arch=None,
                  codesign_identity=None,
                  entitlements_file=None,
                  icon=['favicon.ico'],
                  )


                  • ['lark_manager.py']: 这是主要的入口点,即你要打包的应用程序。

                  • datas=[...]: 项目中需要用到的数据配置文件、静态资源文件,需要添加到datas里面。
                    通常会使用上面的a.datas写法添加:
                    a.datas += [('Utils/test_case.py', './Utils/test_case.py', 'DATA')]
                    a.datas += [('Utils/util_config.py', './Utils/util_config.py', 'DATA')]

                  • hiddenimports=['sqlite3', ...]: 列出那些被导入但 PyInstaller 无法自动检测到的模块,
                    这些模块会被强制包含在打包过程中。

                  • a.version = ' v1.0' 设置了一个版本字符串,这个字符串稍后会被添加到可执行文件的名字中。

                  • name='lark_manager' + a.version: 最终可执行文件的名字将会是 lark_manager v1.0。

                  其他的参数基本可以不变,就使用spec文件生成时的默认值就OK,这里不再赘述。需要经常根据自己的项目动态配置的主要是a.datas和hiddenimports,哪些需要加到a.datas,有一个简单的总结:

                  • 数据文件 和 静态资源文件 通常需要添加到 a.datas 中。

                  • 主脚本 和 被导入的模块,以及标准库和第三方库的文件不需要添加到a.datas 中,PyInstaller 会自动处理它们。

                  最后,你需要根据你打包后的EXE文件运行时的报错信息,根据报错信息添加对应添加缺失的内容到spec文件中,以保障最终的EXE文件运行正常。比如打包出来的EXE文件运行报错:


                  报错信息提示: No module named ‘mss’, 意思是缺少了mss库,那么则需要在spec中的anlysis函数中的hiddenimports=[],加上’mss’:

                    hiddenimports=['mss']

                    添加后重新打包再次运行,EXE文件就可以正常运行起来了




                    END




                    以上就是本次的全部内容,
                    如果对你有帮助,麻烦点赞+分享,你的支持就是作者更新最大的动力!

                    欢迎加入杨叔的测试交流群,沟通交流日常测试工作相关内容,2024一起升职加薪,学习进步!进群方式:扫下方二维码添加杨叔的微信号,备注:进群



                    往期精彩文章推荐





                    文章转载自程序员杨叔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论