如何将python项目打包成Windows环境的exe应用提供给客户使用

将Python项目打包成Windows环境的可执行文件(.exe)可以通过多种工具实现,最常用的是 ​PyInstaller 和 ​cx_Freeze 。以下是详细步骤和注意事项,以 ​PyInstaller 为例:


方法 1:使用 PyInstaller(推荐)​

1. 安装 PyInstaller

复制代码

bash

复制

复制代码
pip install pyinstaller

2. 打包项目

基本命令
复制代码

bash

复制

复制代码
pyinstaller --onefile --windowed --icon=app.ico your_script.py
  • --onefile:生成单个 .exe 文件(否则会生成多个依赖文件)。
  • --windowed:隐藏命令行窗口(适合GUI应用)。
  • --icon=app.ico:设置应用图标(需准备 .ico 文件)。
  • your_script.py:你的Python主程序。
示例(打包一个PyQt5应用)​
复制代码

bash

复制

复制代码
pyinstaller --onefile --windowed --icon=app.ico main.py
高级选项
  • 添加数据文件(如图片、配置文件):

    复制代码

    bash

    复制

    复制代码
    pyinstaller --add-data "data;data" main.py
  • 排除不必要的库(减小体积):

    复制代码

    bash

    复制

    复制代码
    pyinstaller --exclude-module matplotlib --onefile main.py

3. 生成的文件

  • **dist/ 目录**:包含生成的 .exe 文件。
  • **build/ 目录**:临时文件,可删除。

4. 测试 .exe

  • 双击运行 dist/your_script.exe,检查是否正常工作。

  • 如果报错(如缺少依赖),使用 --hidden-import 手动添加:

    复制代码

    bash

    复制

    复制代码
    pyinstaller --hidden-import pandas --onefile main.py

方法 2:使用 cx_Freeze(备选)​

1. 安装 cx_Freeze

复制代码

bash

复制

复制代码
pip install cx_Freeze

2. 创建 setup.py

复制代码

python

复制

复制代码
from cx_Freeze import setup, Executable

# 配置
build_options = {
    "packages": ["os", "sys"],  # 需要包含的库
    "excludes": ["tkinter"],    # 排除的库
    "include_files": ["data/"]  # 数据文件
}

# 主程序
executables = [Executable("main.py", base="Win32GUI", icon="app.ico")]

setup(
    name="MyApp",
    version="1.0",
    description="My Python App",
    options={"build_exe": build_options},
    executables=executables
)

3. 打包

复制代码

bash

复制

复制代码
python setup.py build
  • 生成的 .exe 位于 build/ 目录。

常见问题 & 优化

1. 减小 .exe 体积

  • 使用 --exclude-module 排除不必要的库(如 numpy, pandas)。

  • 使用 UPX 压缩(需下载 UPX):

    复制代码

    bash

    复制

    复制代码
    pyinstaller --onefile --upx-dir=C:\path\to\upx main.py

2. 解决依赖缺失

  • 如果 .exe 运行时提示 ModuleNotFoundError,手动添加:

    复制代码

    bash

    复制

    复制代码
    pyinstaller --hidden-import missing_module --onefile main.py

3. 处理动态导入

  • 如果代码中有 importlib.import_module(),需在 .spec 文件中声明:

    复制代码

    python

    复制

    复制代码
    # 生成.spec文件后修改
    a = Analysis(...,
                 hiddenimports=['module1', 'module2'],
                 ...)

4. 打包后路径问题

  • 使用 sys._MEIPASS 访问打包后的资源文件:

    复制代码

    python

    复制

    复制代码
    import sys
    import os
    
    def resource_path(relative_path):
        if hasattr(sys, '_MEIPASS'):
            return os.path.join(sys._MEIPASS, relative_path)
        return os.path.join(os.path.abspath("."), relative_path)
    
    # 使用示例
    image_path = resource_path("data/image.png")

最终交付

  1. dist/your_app.exe 发送给客户。
  2. 如果依赖较多,建议提供 安装包(如用 Inno Setup 制作安装程序)。

总结

工具 优点 缺点
PyInstaller 简单易用,支持单文件打包 文件体积较大
cx_Freeze 可定制性强 配置稍复杂

推荐 ​PyInstaller 快速打包,​cx_Freeze 用于复杂项目。

相关推荐
xchenhao8 分钟前
SciKit-Learn 全面分析 digits 手写数据集
python·机器学习·分类·数据集·scikit-learn·svm·手写
胡耀超18 分钟前
7、Matplotlib、Seaborn、Plotly数据可视化与探索性分析(探索性数据分析(EDA)方法论)
python·信息可视化·plotly·数据挖掘·数据分析·matplotlib·seaborn
索迪迈科技29 分钟前
STL库——map/set(类函数学习)
开发语言·c++·学习
tangweiguo0305198733 分钟前
Django REST Framework 构建安卓应用后端API:从开发到部署的完整实战指南
服务器·后端·python·django
Dfreedom.34 分钟前
在Windows上搭建GPU版本PyTorch运行环境的详细步骤
c++·人工智能·pytorch·python·深度学习
ForteScarlet1 小时前
Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
android·开发语言·kotlin·jetbrains
兴科Sinco1 小时前
[leetcode 1]给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数[力扣]
python·算法·leetcode
anlogic1 小时前
Java基础 9.10
java·开发语言·算法
程序员奈斯1 小时前
Python深度学习:NumPy数组库
python·深度学习·numpy
yongche_shi1 小时前
第二篇:Python“装包”与“拆包”的艺术:可迭代对象、迭代器、生成器
开发语言·python·面试·面试宝典·生成器·拆包·装包