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 ...(具体参数见各工具文档)。


七、参考链接

相关推荐
用户83562907805111 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805111 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生19 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师20 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码20 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf20 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780511 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python