uv打包Python为exe步骤

uv + PyInstaller:Windows 下打包 .exe 步骤与细节

说明uv(Astral)负责 Python 版本、虚拟环境、依赖锁定与运行命令;不直接生成 .exe 。生成可执行文件需在项目内使用 PyInstaller (或 Nuitka、cx_Freeze 等),通过 uv run 在统一环境中调用。


一、整体流程

  1. uv 初始化项目、固定 Python 版本、安装依赖
  2. PyInstaller 加入开发依赖(--dev
  3. 使用 uv run pyinstalleruv run python -m PyInstaller 打包
  4. 按需处理资源文件、隐藏导入、.spec 文件

产物通常在项目下的 dist\ 目录。


二、环境准备

1. 安装 uv

以官方文档为准:Getting started | uv

PowerShell 示例:

powershell 复制代码
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

2. 初始化项目并固定 Python

powershell 复制代码
cd D:\path\to\your\project
uv init
# 可选:指定 Python 版本(例如 3.12)
uv python pin 3.12

3. 安装业务依赖与 PyInstaller

powershell 复制代码
uv add requests
uv add --dev pyinstaller

三、基本打包命令

1. 单文件 exe(最常见)

入口为 main.py 时:

powershell 复制代码
uv run pyinstaller --onefile --name MyApp main.py
  • --onefile :输出单个 .exe,分发简单;启动时会解压到临时目录,体积略大、冷启动略慢。
  • --name MyApp :生成的 exe 名称(不含 .exe 后缀)。

输出路径:dist\MyApp.exe

2. GUI 程序(不显示黑色控制台)

powershell 复制代码
uv run pyinstaller --onefile --windowed --name MyApp main.py

-w--windowed 等价。

3. 指定图标

powershell 复制代码
uv run pyinstaller --onefile --icon=assets\app.ico --name MyApp main.py

4. 若直接调用 pyinstaller 异常(Windows 偶发)

改用模块方式,避免脚本包装问题:

powershell 复制代码
uv run python -m PyInstaller --onefile --name MyApp main.py

四、重要细节

1. 资源文件(--add-data

Windows 下 PyInstaller 的 --add-data 格式为 源路径;目标路径(分号分隔)。

示例:将项目下的 config 目录打进包,运行时解压到名为 config 的目录:

powershell 复制代码
uv run python -m PyInstaller --onefile `
  --add-data "config;config" `
  --name MyApp main.py

建议在代码中用 importlib.resources 或基于 sys._MEIPASS 的路径解析资源,避免写死开发机绝对路径。

2. 隐藏导入(ModuleNotFoundError

动态导入或 C 扩展依赖未被打包分析到时,需显式声明:

text 复制代码
--hidden-import=包名或模块名

可重复多次。

3. 使用 .spec 文件(推荐复杂项目)

首次生成 spec:

powershell 复制代码
uv run python -m PyInstaller --name MyApp main.py

编辑生成的 MyApp.spec ,调整 Analysis 中的 datashiddenimports,再执行:

powershell 复制代码
uv run python -m PyInstaller MyApp.spec

4. 多文件目录模式(启动更快)

不使用 --onefile 时,默认输出目录 dist\MyApp\ ,内含 MyApp.exe 及依赖文件,需整目录一起分发

powershell 复制代码
uv run python -m PyInstaller --name MyApp main.py

5. 可复现构建(uv.lock

  • pyproject.tomluv.lock 纳入版本控制。
  • 新机器执行 uv sync 后,依赖与本地一致,再执行相同 PyInstaller 命令即可复现构建。

6. 架构与运行库

  • 打包机与目标用户尽量同为 x64(或同为 ARM64)。
  • 若依赖 C 扩展,注意目标机是否安装 VC++ 可再发行组件(视依赖而定)。

7. 杀毒误报与签名

  • 单文件 exe 易被启发式拦截,属常见现象。
  • 企业内分发可考虑 代码签名 降低误报。

五、uv build 与 exe 的区别

命令 产物 用途
uv build wheel / sdist 发布到 PyPI 或内网制品库
PyInstaller 等 .exe + 可能附带目录 终端用户免装 Python 直接运行

uv build 不会生成独立 .exe


六、备选打包工具(简要)

工具 特点
PyInstaller 使用最广,文档与社区多;上文默认方案
Nuitka 编译为 C 再链接,体积与保护性可能更好,构建更长
cx_Freeze 跨平台打包,配置方式与 PyInstaller 不同

同样可在 uv 环境中:uv add --dev nuitkauv run python -m nuitka ...(具体参数见各工具文档)。


七、参考链接

相关推荐
Scott9999HH9 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社10 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海10 小时前
python 列表、元组、集合和字典
开发语言·python
二十雨辰10 小时前
[爬虫]-Urllib
爬虫·python
萧瑟余晖11 小时前
JDK 26 新特性详解
java·开发语言
马优晨11 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
玉鸯12 小时前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制
python·langchain·agent
weixin_4462608512 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
我的xiaodoujiao13 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest