使用PyInstaller打包Python项目过程

Written by

in

文章目录
  • 当你用Python开发了一个桌面应用(如GUI工具、小游戏、自动化程序等),直接分享.py源码给用户显然不友好。 用户可能没有Python环境,也不懂如何配置依赖库。 PyInstaller能将你的代码、资源文件、依赖库全部打包成单个.exe文件,真正做到“开箱即用”。
  • 打开PyCharm,进入你的项目。 调出终端:点击下方菜单栏的 Terminal(或快捷键 Alt+F12)。 安装PyInstaller: pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple 提示:使用清华镜像源加速下载。
  • 以用户提供的命令为例: pyinstaller –noconsole –add-data “D:ProfessionCode_pybbcfg.py;.” –add-data “D:ProfessionCode_pybb1.jpg;.” –add-data “D:ProfessionCode_pybbmusic.mp3;.” –add-data “D:ProfessionCode_pybbHarmonyOS_Sans_SC_Black.ttf;.” –onefile zhu.py 关键参数详解: –noconsole : 运行exe时不显示控制台窗口(适用于GUI程序)。 –onefile : 所有内容打包成单个exe文件,便于分发。 –add-data "源路径;目标路径" : 源路径:资源文件的绝对或相对路径。 目标路径:在exe中的存储位置,.表示与exe同级目录。 注意:Windows中使用分号;,Linux/macOS使用冒号:。 路径处理技巧: 推荐使用相对路径避免绝对路径依赖: –add-data “assets/1.jpg;assets” 特殊字符路径需加引号,如包含空格时:"C:/My Project/image.png;."
  • 打包后资源文件会被解压到临时目录,直接使用原始路径将导致错误!需通过以下方法获取正确路径: import sys import os def resource_path(relative_path): “”” 获取资源的绝对路径 “”” if hasattr(sys, ‘_MEIPASS’): base_path = sys._MEIPASS else: base_path = os.path.abspath(“.”) return os.path.join(base_path, relative_path) # 示例:加载图片 img_path = resource_path(“1.jpg”) image = pygame.image.load(img_path) # 示例:加载字体 font_path = resource_path(“HarmonyOS_Sans_SC_Black.ttf”) font = pygame.font.Font(font_path, 24)
  • 假设项目结构如下: project/ ├── src/ │ ├── main.py │ └── config.py ├── assets/ │ ├── bg.jpg │ ├── bgm.mp3 │ └── font.ttf └── spec/ 打包命令: pyinstaller –noconsole –add-data “assets/*;assets” –onefile src/main.py 代码调整: # config.py中读取资源 cfg_music = resource_path(“assets/bgm.mp3”) cfg_font = resource_path(“assets/font.ttf”)
  • exe文件过大? 使用虚拟环境安装仅需依赖库。 使用UPX压缩(下载UPX,添加–upx-dir参数)。 运行闪退? 命令行中运行exe查看错误信息(去掉–noconsole)。 检查资源路径是否正确。 杀毒软件误报? 使用代码签名证书签名exe。 提交到VirusTotal白名单。 跨平台兼容性? Linux/macOS打包需在对应系统中执行命令。 注意文件路径大小写敏感问题。
  • 对于复杂项目,可生成.spec文件进行配置: pyinstaller zhu.spec 示例spec文件: a = Analysis( [‘zhu.py’], pathex=[‘D:/Project’], binaries=[], datas=[ (‘assets/*.jpg’, ‘assets’), (‘fonts/*.ttf’, ‘fonts’) ], hiddenimports=[], … )
  • 测试驱动打包:每添加一个资源立即测试。 版本管理:记录PyInstaller版本(pip freeze > requirements.txt)。 持续集成:使用GitHub Actions自动化打包。 通过本文,你已掌握PyInstaller的核心用法。现在,将你的创意变成可执行文件,分享给世界吧! 附录: PyInstaller官方文档 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: 使用PyInstaller打包Python脚本为可执行文件的详细指南 python之PyInstaller(将Python脚本打包为可执行文件方式) 从入门到避坑详解Pyinstaller打包Python程序的详细指南 PyInstaller将Python项目打包为exe的踩坑记录 如何使用Python脚本控制PyInstaller打包实战详解 使用PyInstaller如何打包一个包含多个文件的Python项目 PyInstaller打包Python脚本的使用示例
  • 目录
    • 一、为什么需要打包Python程序?
    • 二、环境准备:PyCharm中安装PyInstaller
    • 三、核心命令解析:一行代码实现高级打包
    • 四、资源文件在代码中的正确引用方式
    • 五、实战案例:打包一个带图片、音乐、字体的游戏
    • 六、常见问题与解决方案
    • 七、进阶技巧:使用Spec文件定制打包流程
    • 八、总结与最佳实践

    当你用Python开发了一个桌面应用(如GUI工具、小游戏、自动化程序等),直接分享.py源码给用户显然不友好。

    用户可能没有Python环境,也不懂如何配置依赖库。

    PyInstaller能将你的代码、资源文件、依赖库全部打包成单个.exe文件,真正做到“开箱即用”。

    1. 打开PyCharm,进入你的项目。
    2. 调出终端:点击下方菜单栏的 Terminal(或快捷键 Alt+F12)。
    3. 安装PyInstaller
    pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple

    提示:使用清华镜像源加速下载。

    以用户提供的命令为例:

    pyinstaller --noconsole --add-data "D:ProfessionCode_pybbcfg.py;." --add-data "D:ProfessionCode_pybb1.jpg;." --add-data "D:ProfessionCode_pybbmusic.mp3;." --add-data "D:ProfessionCode_pybbHarmonyOS_Sans_SC_Black.ttf;." --onefile zhu.py

    关键参数详解:

    • --noconsole : 运行exe时不显示控制台窗口(适用于GUI程序)。
    • --onefile : 所有内容打包成单个exe文件,便于分发。

    –add-data "源路径;目标路径" :

    • 源路径:资源文件的绝对或相对路径。
    • 目标路径:在exe中的存储位置,.表示与exe同级目录。
    • 注意:Windows中使用分号;,Linux/macOS使用冒号:

    路径处理技巧:

    推荐使用相对路径避免绝对路径依赖:

    --add-data "assets/1.jpg;assets"

    特殊字符路径需加引号,如包含空格时:"C:/My Project/image.png;."

    打包后资源文件会被解压到临时目录,直接使用原始路径将导致错误!需通过以下方法获取正确路径:

    import sys
    import os
    
    def resource_path(relative_path):
        """ 获取资源的绝对路径 """
        if hasattr(sys, '_MEIPASS'):
            base_path = sys._MEIPASS
        else:
            base_path = os.path.abspath(".")
        return os.path.join(base_path, relative_path)
    
    # 示例:加载图片
    img_path = resource_path("1.jpg")
    image = pygame.image.load(img_path)
    
    # 示例:加载字体
    font_path = resource_path("HarmonyOS_Sans_SC_Black.ttf")
    font = pygame.font.Font(font_path, 24)

    假设项目结构如下:

    project/
    ├── src/
    │   ├── main.py
    │   └── config.py
    ├── assets/
    │   ├── bg.jpg
    │   ├── bgm.mp3
    │   └── font.ttf
    └── spec/

    打包命令:

    pyinstaller --noconsole --add-data "assets/*;assets" --onefile src/main.py

    代码调整:

    # config.py中读取资源
    cfg_music = resource_path("assets/bgm.mp3")
    cfg_font = resource_path("assets/font.ttf")

    exe文件过大?

    • 使用虚拟环境安装仅需依赖库。
    • 使用UPX压缩(下载UPX,添加--upx-dir参数)。

    运行闪退?

    • 命令行中运行exe查看错误信息(去掉--noconsole)。
    • 检查资源路径是否正确。

    杀毒软件误报?

    • 使用代码签名证书签名exe。
    • 提交到VirusTotal白名单。

    跨平台兼容性?

    • Linux/macOS打包需在对应系统中执行命令。
    • 注意文件路径大小写敏感问题。

    对于复杂项目,可生成.spec文件进行配置:

    pyinstaller zhu.spec

    示例spec文件:

    a = Analysis(
        ['zhu.py'],
        pathex=['D:/Project'],
        binaries=[],
        datas=[
            ('assets/*.jpg', 'assets'),
            ('fonts/*.ttf', 'fonts')
        ],
        hiddenimports=[],
        ...
    )

    • 测试驱动打包:每添加一个资源立即测试。
    • 版本管理:记录PyInstaller版本(pip freeze > requirements.txt)。
    • 持续集成:使用GitHub Actions自动化打包。

    通过本文,你已掌握PyInstaller的核心用法。现在,将你的创意变成可执行文件,分享给世界吧!

    附录:

    PyInstaller官方文档

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

    您可能感兴趣的文章:

    • 使用PyInstaller打包Python脚本为可执行文件的详细指南
    • python之PyInstaller(将Python脚本打包为可执行文件方式)
    • 从入门到避坑详解Pyinstaller打包Python程序的详细指南
    • PyInstaller将Python项目打包为exe的踩坑记录
    • 如何使用Python脚本控制PyInstaller打包实战详解
    • 使用PyInstaller如何打包一个包含多个文件的Python项目
    • PyInstaller打包Python脚本的使用示例

    站内搜索