【Python】uvpacker:跨平台打包 Windows 应用

一、用途概述

uvpacker 用于在 macOS、Linux 或 Windows 上构建 Windows (win_amd64) 平台的 Python 应用分发目录

典型问题场景:

  • 开发环境在 macOS / Linux
  • 目标用户主要在 Windows
  • 希望交付"无需安装 Python、可直接运行"的应用

传统方案(如 PyInstaller + Windows 构建环境)存在以下问题:

  • 构建依赖 Windows 环境
  • 依赖解析受本地环境影响,不可复现
  • 打包过程不透明,问题定位困难

uvpacker 的设计目标是:

  • 明确目标平台(Windows)
  • 显式依赖解析过程(基于 uv
  • 构建结果可复现
  • 降低跨平台分发复杂度

其输出为一个自包含目录,包含:

  • CPython Embedded Runtime(Windows)
  • 项目依赖(目标平台为 win_amd64
  • 自动生成的 .exe 启动器

该目录可直接分发,用户无需系统 Python 环境。


二、使用方法

1. 安装 uv

uvpacker 依赖 uv 运行,需先安装 uv

复制代码
curl -LsSf https://astral.sh/uv/install.sh | sh

2. 基本用法

bash 复制代码
uvx uvpacker path/to/project
  • 输入:包含 pyproject.toml 的项目目录
  • 输出:dist/<project-name>

3. 指定输出目录

bash 复制代码
uvx uvpacker path/to/project -o path/to/output

4. 固定工具版本

bash 复制代码
uvx uvpacker==0.2.1 path/to/project

建议在 CI 环境中固定版本,以保证构建一致性。


5. 项目要求

目标项目需满足以下条件:

  • 使用 pyproject.toml

  • 定义 [project.scripts](入口脚本)

    [project.scripts]
    uvpacker = "uvpacker:main"

  • 定义 [build-system]

    [build-system]
    requires = ["uv_build>=0.11.2,<0.12.0"]
    build-backend = "uv_build"

  • 明确指定 Python 次版本:

toml 复制代码
requires-python = "==3.11.*"

uvpacker 会基于该约束:

  • 解析对应 patch 版本(如 3.11.9
  • 下载对应的 Windows Embedded Runtime

该机制用于保证 Python 运行时版本的确定性。


三、补充说明

1. 输出结构

默认输出目录结构如下:

text 复制代码
dist/<project-name>/
  runtime/
  packages/
  <script>.exe
  • runtime/:Windows 嵌入式 Python 运行时
  • packages/:项目及其依赖(wheel 形式)
  • <script>.exe:入口启动器,对应 [project.scripts]

运行流程:

  • 启动器调用 runtime/python.exe
  • 修改 _pth 文件,将 packages/ 加入模块搜索路径
  • 应用运行不依赖系统 Python

2. 适用范围

适用于:

  • 纯 Python 项目
  • 所有依赖均提供 Windows wheel

典型场景包括:

  • 桌面应用(如 PySide、Qt)
  • 本地服务(如 FastAPI)
  • 内部工具分发
  • CI/CD 自动构建发布

3. 跨平台构建边界

支持:

  • 纯 Python 项目跨平台构建

不支持:

  • 项目自身包含 native 扩展(C、C++、Rust 等)时的跨平台构建

对于包含 native 扩展的项目:

  • 需在 Windows 环境中构建
  • uvpacker 不尝试进行交叉编译

该限制用于保证构建过程的可靠性与可控性。


4. 与 PyInstaller 的差异

对比维度 PyInstaller uvpacker
输出形式 单文件或少量文件 结构化目录
构建依赖 当前环境 显式目标平台
依赖解析 隐式 基于 uv
可复现性 较低
跨平台构建 不支持 支持(纯 Python)

uvpacker 更强调构建过程的确定性与工程化,而非最小分发体积。


5. 示例项目

仓库提供示例:

  • example/web-demo:FastAPI 应用(含静态资源)
  • example/qt-demo:PySide6 桌面应用

用于验证不同类型应用的打包行为。


四、总结

uvpacker 提供了一种面向工程实践的解决方案,用于在非 Windows 环境中构建 Windows Python 应用:

  • 构建过程显式、可控
  • 依赖解析可复现
  • 输出结构清晰,便于分发与集成
  • 明确约束跨平台能力边界

适用于对构建稳定性和可维护性有要求的项目。


五、仓库地址

https://github.com/touken928/uvpacker

相关推荐
神仙别闹17 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
Y幽谷客17 小时前
Python加载本地大模型(Qwen3.5 8B)
python·大模型
伞伞悦读17 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
线上放牧人18 小时前
Windows删除图标缓存
windows·python·pyqt
qq_54702617918 小时前
Python 变量和简单数据类型
python
智搜广告19 小时前
智搜广告:科技行业AI回答优化公司如何破局
大数据·python·elasticsearch·geo
IpdataCloud20 小时前
AI智能体调用工具怎么核验来源IP?归属地、网络类型与代理风险识别(含Python代码)
数据库·python·tcp/ip
2601_9669496520 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
蒸鱼Yuzheng20 小时前
Python 游戏测试开发怎么准备:日志解析、接口校验、并发与可维护性
自动化测试·python·测试开发·面试题·游戏测试
m0_7345717620 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g