【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

相关推荐
老王爱玩车2 小时前
文件操作从打开到缓冲区
c语言·开发语言·学习
SunnyDays10113 小时前
Java 合并 PDF 文件:完整合并、指定页面合并与流合并
java·开发语言·合并pdf
金銀銅鐵3 小时前
[Java] 用GUI展示class文件顶层的 access_flags
后端·python·ai编程
kimnoic3 小时前
Python操作xlwings的实例详解
开发语言·python
2601_957883843 小时前
2026年10月 外星人笔记本维修须知
python·电脑
泡茶喝茶写代码4 小时前
A股量化数据工程:从 REST 接口到策略信号(第 17 篇):创新高与新低扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
栗子~~4 小时前
java - logstash-logback-encoder 集成 demo
java·开发语言·logback
VIP_CQCRE4 小时前
用 Ace Data Cloud 接入 OpenAI 兼容语音转文字:一份能直接运行的 API 指南
python·openai·api·语音识别·acedatacloud
ESDWAN4 小时前
跨境网络频繁掉线怎么排查?从企业内网到 SD-WAN 链路的故障诊断
开发语言·网络·php
程序员zgh5 小时前
C++ erase() 函数用法
c语言·开发语言·c++·学习