Files
QPyPack/README.md
T
2026-08-26 11:40:48 +08:00

210 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# QPyPack
<p align="center">
<a href="README.md">简体中文</a> |
<a href="README_EN.md">English</a> |
<a href="docs/readme/README_TW.md">繁體中文</a> |
<a href="docs/readme/README_JA.md">日本語</a> |
<a href="docs/readme/README_KO.md">한국어</a> |
<a href="docs/readme/README_FR.md">Français</a> |
<a href="docs/readme/README_DE.md">Deutsch</a> |
<a href="docs/readme/README_ES.md">Español</a> |
<a href="docs/readme/README_RU.md">Русский</a> |
<a href="docs/readme/README_PT.md">Português</a>
</p>
<p align="center">
<!-- PyPI Version -->
<a href="https://pypi.org/project/qpypack/">
<img src="https://img.shields.io/pypi/v/qpypack.svg?color=blue&logo=pypi&logoColor=white" alt="PyPI version" />
</a>
<!-- Python Versions -->
<a href="https://pypi.org/project/qpypack/">
<img src="https://img.shields.io/pypi/pyversions/qpypack.svg?logo=python&logoColor=white" alt="Python versions" />
</a>
<!-- PyPI Downloads -->
<a href="https://pypistats.org/packages/qpypack">
<img src="https://img.shields.io/pypi/dm/qpypack?color=orange&logo=pypi&logoColor=white" alt="PyPI Downloads" />
</a>
<!-- Supported Platforms -->
<img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-informational" alt="Platform Support" />
<br>
<!-- Release Date -->
<a href="https://github.com/Qwejay/QPyPack/releases">
<img src="https://img.shields.io/github/release-date/Qwejay/QPyPack?color=brightgreen&logo=github" alt="Release Date" />
</a>
<!-- Last Commit -->
<a href="https://github.com/Qwejay/QPyPack/commits/main">
<img src="https://img.shields.io/github/last-commit/Qwejay/QPyPack" alt="Last Commit" />
</a>
<!-- GitHub License -->
<a href="https://github.com/Qwejay/QPyPack/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/Qwejay/QPyPack.svg" alt="License" />
</a>
<!-- GitHub Stars -->
<a href="https://github.com/Qwejay/QPyPack/stargazers">
<img src="https://img.shields.io/github/stars/Qwejay/QPyPack.svg?logo=github&color=gold" alt="GitHub stars" />
</a>
</p>
---
<p align="center">
<strong>现代化、开箱即用的跨平台 Python 应用打包 GUI 工具</strong><br>
<sub>基于 PyInstaller 与 Nuitka 双引擎驱动,提供可视化配置、静态依赖分析与自动化构建流</sub>
</p>
## 📌 项目概述
**QPyPack** 是一款专为 Python 开发者打造的跨平台图形化打包工具。通过深度整合 **PyInstaller**(解释器与字节码打包)与 **Nuitka**(C/C++ 原生编译)双核心引擎,将繁琐的底层编译参数、隐式依赖分析、环境隔离与资源收集等流程抽象为直观的可视化界面。
无论用于打包轻量命令行脚本,还是包含大型复杂依赖(如 PySide6 / PyQt、Playwright、CustomTkinter、FastAPI 等)的桌面或服务端应用,QPyPack 均可提供稳定、高成功率且可重现的构建体验。
---
## 📸 界面预览 (Screenshots)
<p align="center">
<img width="32%" alt="主界面(英文)" src="https://github.com/user-attachments/assets/9d16c68e-d283-4020-86c1-9d4791756c29" />
<img width="32%" alt="主界面(中文)" src="https://github.com/user-attachments/assets/0147460d-1e9e-4612-9b52-9d347d81b7c5" />
<img width="32%" alt="构建引擎与环境" src="https://github.com/user-attachments/assets/0ad4db6d-b008-4018-bd69-40a369a10b7d" />
<br />
<img width="32%" alt="依赖管理与扫描" src="https://github.com/user-attachments/assets/c7fd1218-d079-4898-a97c-aa980c4d1375" />
<img width="32%" alt="优化、签名与安全" src="https://github.com/user-attachments/assets/e5b7500e-2a0d-4c6d-b20b-7d8d2d3bac8d" />
<img width="32%" alt="关于与系统信息" src="https://github.com/user-attachments/assets/e652b222-49f5-44cd-ad3f-d93369ede26b" />
</p>
---
## 🛠️ 核心架构与特性
### 1. 双构建引擎与精简优化
* **双引擎无缝切换**:
* **PyInstaller**:构建速度快,零 C 编译器依赖,兼具优异的兼容性与生态支持。
* **Nuitka**:将 Python 源码直接转译为 C/C++ 二进制,具备执行速度快、抗反编译能力强、产物体积小等特点。
* **LTO 链接优化与模块剪枝**:在精简模式(Lite Mode)下支持开启 `--lto=yes` 链接时间优化;针对 PySide/PyQt 自动识别并剔除未引用的重型子模块(如 WebEngine、3D、Quick 等),有效防止产物体积冗余。
* **灵活产物形态**:支持 **单文件 (`--onefile`)** 与 **目录模式 (`--onedir`)**,支持自定义依赖内部存放目录 (`--contents-directory`)。
### 2. 静态分析与依赖拓扑防护
* **原生 AST 递归扫描**:内置纯 Python 实现的抽象语法树(AST)静态分析器,无需执行代码即可递归分析源码及项目目录中的依赖导入。
* **智能包名映射系统**:内置主流第三方库导入名与 PyPI 包名映射表(如 `cv2` $\to$ `opencv-python`、`PIL` $\to$ `pillow`、`win32com` $\to$ `pywin32`),支持用户自定义扩展。
* **废弃兼容包动态隔离 (Backport Isolation)**:自动识别并屏蔽与目标 Python 版本内置模块冲突的过时 Backport 库(如在 Python 3.10+ 下自动隔离 `pathlib`、`typing` 等),防止运行时引发不可预测的命名空间覆盖。
### 3. 环境自动化管理与容错机制
* **C/C++ 编译器自动托管**:自动检测本地 MSVC、Clang (LLVM) 与 GCC 环境;在缺失本地编译器时,Nuitka 引擎将自动下载并托管兼容的 MinGW-w64 工具链。
* **环境生命周期管理**:支持独立隔离虚拟环境与共享虚拟环境模式;支持对历史失效虚拟环境的一键扫描与空间清理。
* **自适应资源与错误自愈**:
* 构建前自动评估磁盘与物理内存,低内存状态下自适应下调并发数(Adaptive Concurrency)。
* 自动拦截内存分配溢出(OOM / ZstdError)并自动降级为单线程低内存模式重试。
* 自动规避 Windows 杀毒软件对中间图标/临时文件的独占锁定。
### 4. 代码签名与交付保障
* **智能数字签名托管**:支持在 Windows 产物输出后自动应用 Authenticode 数字签名(兼容 Signtool 与 PowerShell 引擎,集成 RFC 3161 时间戳服务);支持 macOS 下的一键 `codesign` 代码签名。
* **自签名证书套件**:内置 Windows 自签名代码签名证书(`.pfx`)生成工具,支持商业私钥证书与密码配置。
* **项目配置预设导入/导出**:支持将所有构建参数、资源清单与映射规则导出为独立的 `.qpypack` 项目工程预设文件,便于团队共享与持续集成。
### 5. 跨平台交互体验
* **拖拽即用**:直接拖入 Python 源码即可自动解析模块元数据(版本、作者、应用名)、推导入口点并匹配同级资源图标。
* **矢量渲染与全球化 i18n**:全界面基于 Google Material SVG 矢量图标绘制,完美适配 4K/高分屏 DPI 缩放;内置涵盖简繁中文、英语、日语、韩语、德语、法语等 17 种语言的即时国际化系统。
---
## 📊 引擎选型对比 (PyInstaller vs. Nuitka)
| 评估维度 | PyInstaller | Nuitka |
| :--- | :--- | :--- |
| **打包原理** | 打包 Python 解释器与字节码文件 (`.pyc`) | 将 Python 代码编译为原生 C/C++ 二进制文件 |
| **构建速度** | 极快(通常 10 ~ 60 秒) | 较慢(涉及 C++ 代码生成与编译器优化) |
| **C/C++ 编译器依赖** | 无需任何外部编译器 | 依赖 MSVC / GCC / Clang(支持自动托管下载) |
| **代码保护等级** | 基础(可通过反编译工具还原源码逻辑) | 极高(原生机器码,深层抗逆向分析) |
| **产物运行性能** | 接近原生 Python 运行速度 | 启动速度快,部分循环与计算密集型逻辑更优 |
| **推荐适用场景** | 快速迭代测试、内部工具、复杂动态导入项目 | 商业交付软件、核心算法保护、追求体积与启动速度 |
---
## ⚡ 快速开始 (Quick Start)
> 💡 **首次使用?** 建议查阅 3 分钟 [**📖 快速入门指南 (QUICKSTART.md)**](QUICKSTART.md) 了解详细的使用教程与典型场景配置指南。
### 安装方式 1:通过 pip / pipx 安装(推荐)
在 Python >= 3.8 的环境中执行:
```bash
# 通过 pip 安装
pip install qpypack
# 启动图形界面
qpypack
```
*若使用现代包管理器(推荐):*
```bash
# 使用 pipx 隔离运行
pipx run qpypack
# 或使用 uv 极速启动
uvx qpypack
```
### 安装方式 2:使用独立预编译免安装版
无需预先安装 Python 环境,可直接在 GitHub Release 页面下载适用于您操作系统的可执行文件:
👉 [**下载预编译版本 (GitHub Releases)**](https://github.com/Qwejay/QPyPack/releases)
---
## 📋 常用配置说明
### 依赖与资源释放路径 (`sys._MEIPASS`)
在单文件打包模式下,附加的数据文件(图片、配置、模型等)会在运行时临时解压至特定沙盒目录。请确保在源码中按如下标准方式解析路径:
```python
import sys
import os
from pathlib import Path
def get_asset_path(relative_path: str) -> Path:
"""获取打包后资源的绝对路径"""
if hasattr(sys, "_MEIPASS"):
# PyInstaller 单文件解压目录
base_path = Path(sys._MEIPASS)
elif "__compiled__" in globals():
# Nuitka 二进制运行目录
base_path = Path(sys.argv[0]).resolve().parent
else:
# 开发调试环境目录
base_path = Path(__file__).resolve().parent
return base_path / relative_path
```
---
## 📅 版本更新历史 (Changelog)
详细的版本演进路线、功能新增与缺陷修复说明请参阅 [CHANGELOG.md](CHANGELOG.md)。
---
## 💖 参与贡献与赞助 (Sponsorship & Contributing)
QPyPack 是一个遵循开源理念的项目。如果您在日常开发或工作中受益于本项目,欢迎通过以下方式支持本项目的长期维护与迭代:
- 🌟 **Star 支持**:在 [GitHub](https://github.com/Qwejay/QPyPack) 上为项目点亮 Star。
- 🐛 **反馈与建议**:提交 [Issue](https://github.com/Qwejay/QPyPack/issues) 反馈缺陷或提出改进需求。
- ⚡ **赞助项目**:通过 [爱发电平台](https://www.ifdian.net/a/qwejay) 进行无偿资助(支持微信 / 支付宝)。
> *注:赞助属于对开源社区项目的无偿鼓励,不涉及任何商业承诺或定制开发服务。感谢所有支持开源社区建设的开发者!*
---
## 📄 开源许可 (License)
本项目基于 [GNU General Public License v3.0 (GPL-3.0)](LICENSE) 协议开源。
> [!IMPORTANT]
> **关于构建产物的版权说明**:
> 使用 QPyPack 构建生成的最终应用程序与二进制产物,其**知识产权与开源授权完全由使用者自行决定**,QPyPack 的 GPL-3.0 许可协议不会对您的编译产物施加传染性约束。
<p align="right">Copyright (C) 2026 QwejayHuang.</p>