【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

相关推荐
人道领域10 小时前
【LeetCode刷题日记】93.复原IP地址
java·开发语言·算法·leetcode
caimouse10 小时前
Reactos 第 3 章 内存管理 — 【中篇】Hyperspace、系统空间、API 与异常
c语言·开发语言·windows·架构
摇滚侠10 小时前
JavaWeb 全套教程 Listener 112-113
java·开发语言·servlet·tomcat·intellij-idea
财经资讯数据_灵砚智能10 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月6日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能
hixiong12310 小时前
C# Tokenizers.DotNet测试工具
开发语言·人工智能·llm
曹牧10 小时前
Java:Deprecated 是
java·开发语言
caimouse11 小时前
Reactos 第 4 章 对象管理 — 4.1 对象与对象目录
服务器·c语言·开发语言·windows·架构
千寻girling11 小时前
一周没跑步了 ,今日跑步 5KM , 哑铃+健身 20min , 俯卧撑 30 个 ;
数据结构·c++·python·算法·leetcode·职场和发展·线性回归
半兽先生11 小时前
flv.js解决其中一个监控断线导致其他的监控播放阻塞
开发语言·javascript·ecmascript
CTA量化套保11 小时前
Jupyter Notebook 反复运行天勤策略内存涨:close 与内核习惯
ide·人工智能·python·jupyter