使用PyInstaller打包Python项目过程

 更新时间:2025年10月20日 09:44:04   作者:靠近彗星  
本文介绍了使用PyInstaller将Python程序打包为可执行文件的流程,包括环境准备、核心命令解析、资源文件引用、实战案例、常见问题解决及进阶技巧,帮助开发者实现“一键分发”,提升程序易用性与兼容性

一、为什么需要打包Python程序?

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

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

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

二、环境准备:PyCharm中安装PyInstaller

  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_py\bb\cfg.py;." --add-data "D:\ProfessionCode_py\bb\1.jpg;." --add-data "D:\ProfessionCode_py\bb\music.mp3;." --add-data "D:\ProfessionCode_py\bb\HarmonyOS_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文件定制打包流程

对于复杂项目,可生成.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官方文档

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python用GET方法上传文件

    Python用GET方法上传文件

    本文给大家介绍的是在Python中使用GET方法实现上传文件的方法,起因是有网友说Get方法不能用来上传文件,于是就做了这个例子,这里分享给大家,有需要的小伙伴参考下吧。
    2015-03-03
  • 在Python中封装GObject模块进行图形化程序编程的教程

    在Python中封装GObject模块进行图形化程序编程的教程

    这篇文章主要介绍了在Python中封装GObject模块进行图形化程序编程的教程,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • python json-rpc 规范源码阅读

    python json-rpc 规范源码阅读

    这篇文章主要为大家介绍了python json-rpc 规范的源码阅读,以及jsonrpcclient与jsonrpcserver的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Python读取文件的8种常用方式

    Python读取文件的8种常用方式

    这篇文章主要给大家介绍了关于Python读取文件的8种常用方式,在编程语言中,文件读写是最常见的IO操作,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 详解Django CAS 解决方案

    详解Django CAS 解决方案

    这篇文章主要介绍了详解Django CAS 解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • git进行版本控制心得详谈

    git进行版本控制心得详谈

    这篇文章主要介绍了git进行版本控制的心得和经验,给并大家总结了作者的技巧,需要的朋友们参考一下吧。
    2017-12-12
  • Python组合pyenv和venv进行项目环境隔离配置指南

    Python组合pyenv和venv进行项目环境隔离配置指南

    这篇文章将详细讲解如何通过 pyenv(管理 Python 解释器版本)和 venv(Python 内置虚拟环境)的组合,实现不同项目的 Python 版本隔离、依赖版本隔离,彻底解决一个环境跑所有项目导致的版本冲突的问题,希望对大家有所帮助
    2026-02-02
  • numpy中的transpose函数中具体使用方法

    numpy中的transpose函数中具体使用方法

    本文主要介绍了numpy中的transpose函数中具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python调用cmd命令时遇到的路径空格问题和中文乱码的解决

    python调用cmd命令时遇到的路径空格问题和中文乱码的解决

    这篇文章主要介绍了python调用cmd命令时遇到的路径空格问题和中文乱码的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python 使用 environs 库定义环境变量的方法

    Python 使用 environs 库定义环境变量的方法

    这篇文章主要介绍了Python 使用 environs 库来更好地定义环境变量,本节我们以 Python 项目为例,说说环境变量的设置。通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论