v2.7.12: Optimize Nuitka bloat control, fix cleanup file locks, and expand library support

- Enable Nuitka anti-bloat plugin and dev-module exclusions by default to prevent size bloat.
- Remove Nuitka --remove-output to prevent FATAL build crashes caused by OneDrive/antivirus file locks.
- Fix built-in standard library manifest by adding 'traceback' and 'warnings'.
- Expand UPX safe exclusions (Qt5, sqlite3, libcrypto/libssl).
- Add resource auto-collection for pyecharts and pyppeteer.
- Enhance GUI detection for qtpy, pyglet, toga, and pyqtgraph.
- Update default package mappings and modern Python download matrix.
This commit is contained in:
QwejayHuang committed 2026-08-24 23:30:10 +08:00
1 parent 8d4282e348
commit 51b1f78b72
20 files changed
+151 -48

No files matched your search

+28 -12
View File
@@ -9,12 +9,28 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
---
# 更新日志 (Changelog)
## [2.7.12] - 2026-08-24
### 新增
- **增强常用包与生态映射**:扩充 `DEFAULT_MAPPINGS` ,防止依赖误识别;新增对夸克网盘目录锁定的安全预警。
- **扩展 UI 框架智能识别**:GUI 探测库新增 `qtpy`、`pyglet`、`toga`、`pyqtgraph`,自动适配“隐藏控制台”属性。
- **升级 Python 在线安装适配链**:重构内置解释器安装矩阵与支持等级,适配 Python 3.14+ 现代化运行时生命周期,优化高低版本兼容推荐策略。
### 更改
- **默认启用 Nuitka 防膨胀机制**:Nuitka 引擎默认启用 `anti-bloat` 插件与基础测试模块拦截规则,解决默认兼容模式下打包体积异常暴增的问题。
- **优化自动化资源全量收集**:为 PyInstaller 与 Nuitka 引擎的自动收集规则追加 `pyecharts` 和 `pyppeteer` 支持,避免图表发白与浏览器驱动丢失。
- **强化 UPX 动态库安全白名单**:UPX 排除规则进一步扩充至 `Qt5` 系列、`sqlite3.dll` 及 `libcrypto/libssl`,防止加壳损坏数据库与 HTTPS 网络组件。
### 修复
- **修复云盘与杀软文件死锁导致的构建中断**:移除 Nuitka 的 `--remove-output` 参数,改由 QPyPack 接管清理,解决 OneDrive 同步锁或杀毒软件占用引发的 `FATAL` 致命报错。
- **修复内置标准库误报与冗余安装**:补齐内置标准库清单中遗漏的 `traceback` 与 `warnings`,修复 Python 3.9 等低版本环境下将其误判为第三方依赖并尝试 pip 下载报错的问题。
---
## [2.7.11] - 2026-08-21
### 新增
- **Python 3.13+ 编译器适配**:新增针对 Python 3.13+ 的 Zig 编译后端智能调度支持,彻底规避 MinGW64 在高版本 Python 中被废弃导致的打包失败问题。
- **Python 3.13+ 编译器适配**:新增针对 Python 3.13+ 的 Zig 编译后端智能调度支持,规避 MinGW64 在高版本 Python 中被废弃导致的打包失败问题。
- **环境冲突智能诊断与引导**:在构建中断时自动识别编译器版本过低、Windows SDK 缺失等环境冲突特征,提供针对性的解决方案及切换引擎建议。
- **扩展废弃兼容包隔离规则**:在核心依赖治理规则中新增对(Python 3.11+ 内置模块)的动态屏蔽与隔离支持,防止旧依赖冲突。
@@ -76,7 +92,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
- **更新AI翻译工具**:现在能够反向补充主程序缺失的字典,并且统一使用英文标签作为日志提示前缀。
#### 修复
- **临时目录残留彻底清理**:修复非沙盒模式下自定义临时路径无法完全删除的问题,优化为强力递归清理,彻底释放残留的编译缓存。
- **临时目录残留清理**:修复非沙盒模式下自定义临时路径无法完全删除的问题,优化为强力递归清理,释放残留的编译缓存。
- **界面状态同步修复**:修复拖入新脚本或重置界面时,“保留本地虚拟环境”勾选框状态未被正确复位的问题。
---
@@ -84,7 +100,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
## [2.7.7] - 2026-08-09
#### 新增
- **配置写入保护**:引入原子化保存机制,彻底杜绝因断电、死机或磁盘满导致的配置丢失/损坏问题。。
- **配置写入保护**:引入原子化保存机制,杜绝因断电、死机或磁盘满导致的配置丢失/损坏问题。。
- **提高编码兼容**:升级源码与依赖的读取逻辑,智能兼容 GBK、带 BOM 的 UTF-8 等多种复杂编码,告别乱码闪退。
- **抗杀软拦截**:产物输出阶段加入智能重试机制,有效解决生成瞬间被安全软件锁定而导致的“权限不足”报错。
- **稳定性增强**:增加全局异常日志捕获,并隔离了引擎编译时的环境变量,避免干扰主程序运行。
@@ -105,7 +121,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
#### 改进
- **环境自愈与容错降级**:重构虚拟环境有效性校验逻辑,检测到环境损坏或清理失败时自动降级至临时沙箱,确保打包流程零中断。
- **跨平台进程彻底回收**:优化打包任务取消逻辑,Linux / macOS 平台开启独立会话组销毁,彻底解决中断构建时的后台残留进程。
- **跨平台进程回收**:优化打包任务取消逻辑,Linux / macOS 平台开启独立会话组销毁,解决中断构建时的后台残留进程。
- **环境检测与降级告警**:优化 Python 解释器版本与架构(x64/x86)检测超时处理,增加完善的异常捕获与日志降级提示。
- **界面文案精炼**:重构依赖项与虚拟环境复选框文本,统一清理确认对话框按钮样式与风险提示。
@@ -199,8 +215,8 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
* **控制台程序运行时崩溃**:修复因控制台“按回车退出逻辑与源码语法块作用域/闭合冲突引发的崩溃问题。
### 改进
* **AST 解析引擎原生化重构**:将源码隐式依赖扫描由子进程调用彻底重构为同进程原生 AST 模块解析,大幅降低系统资源开销并成倍提升扫描速度。
* **环境检索异步并发加速**:引入多线程异步并发检测机制,对系统内所有候选 Python 环境进行并行嗅探与版本校验,彻底消除软件启动时的 I/O 卡顿。
* **AST 解析引擎原生化重构**:将源码隐式依赖扫描由子进程调用重构为同进程原生 AST 模块解析,大幅降低系统资源开销并成倍提升扫描速度。
* **环境检索异步并发加速**:引入多线程异步并发检测机制,对系统内所有候选 Python 环境进行并行嗅探与版本校验,消除软件启动时的 I/O 卡顿。
* **纯矢量 UI 规范与 Emoji 清理**:全面清理侧边栏、Tab 标签及语言列表中的 Emoji 表情,全量升级为 Google Material SVG 矢量图标栈,解决 Linux 及老旧 Windows 系统下的字体回退乱码与排版跳动问题。
* **卡片式动态构建状态反馈**:主面板拖拽区与状态栏支持实时捕获并渲染编译引擎(Nuitka / Scons / PyInstaller)极细粒度的编译进度文本,大幅缓解打包等待焦虑。
* **重构“关于”页面与赞助交互**:全新设计“关于”选项卡,引入可视化 GitHub、PyPI、Issues 动作行按钮及自愿赞助模块。
@@ -212,7 +228,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
## [2.6.2] - 2026-07-27
* **新增界面推移动画**:重构切页逻辑,新增双图层平滑推移过渡动画,彻底消除从设置页返回主界面时的排版闪烁与图标跳动。
* **新增界面推移动画**:重构切页逻辑,新增双图层平滑推移过渡动画,消除从设置页返回主界面时的排版闪烁与图标跳动。
* **非打断式通知系统**:全面剥离强侵入式的 `QMessageBox` 阻塞弹窗,改用底部状态栏 Toast 轻量级通知,保障打包工作流连贯。
* **错误日志红色高亮**:遇致命异常、锁定文件或依赖缺失时,自动展开日志面板并以醒目红色 HTML 字体高亮呈现,便于快速定位。
@@ -269,7 +285,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
## [2.5.5] - 2026-07-22
* **消除误删风险**:优化目录 `build/dist` 智能清理,保护桌面及工作区安全。
* **全沙盒隔离编译**:引入系统级临时目录隔离输出,彻底解决跨盘符与路径割裂异常。
* **全沙盒隔离编译**:引入系统级临时目录隔离输出,解决跨盘符与路径割裂异常。
* **修复路径映射与 UX**:构建 cwd 重定向至源码目录以完美解析相对路径;修正 `open_dist` 打开逻辑。
* **修复 pipreqs 崩溃**:解决依赖自动扫描过程中的编码中断问题。
@@ -279,7 +295,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
* **新增精简模式**:自动剔除 `pip`、`unittest` 等冗余库并启用 Nuitka `-OO` 优化,大幅缩减产物体积;配套深度源码静态扫描(至多检索 500 个本地依赖),保障极致精简下的运行稳定性。
* **修复 UPX 假性报错**:当未勾选 UPX 时,显式向引擎传递 `--noupx` 指令,阻断 PyInstaller 静默调用系统 UPX 造成的兼容性报错与日志干扰。
* **修复日志中文乱码**:对底层命令行调用 (`subprocess`) 全面强制追加 `encoding="utf-8"` 参数,彻底解决 Windows 默认编码 (GBK) 解析字节流时引发的控制台乱码。
* **修复日志中文乱码**:对底层命令行调用 (`subprocess`) 全面强制追加 `encoding="utf-8"` 参数,解决 Windows 默认编码 (GBK) 解析字节流时引发的控制台乱码。
---
@@ -298,7 +314,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
## [2.5.2] - 2026-07-15
* **重构编译后端指令集**:将 PyInstaller 与 Nuitka 的底层打包参数生成逻辑重构为两套完全独立、互不干扰的构建分支,彻底消除参数污染隐患。
* **重构编译后端指令集**:将 PyInstaller 与 Nuitka 的底层打包参数生成逻辑重构为两套完全独立、互不干扰的构建分支,消除参数污染隐患。
* **优化 Nuitka 附加资源兼容性**:针对 Nuitka 编译器在处理单个附加数据文件时,若目标相对路径为 `.` 会导致编译崩溃的问题进行了自适应修复 (`os.path.normpath` 路径标准化)。
* **修正 Nuitka 排除模块指令**:将排除特定模块参数修正为 Nuitka 官方标准的 `--nofollow-import-to`。
* **完善 Windows 二进制属性映射**:修正应用描述正确映射至 `--file-description`,应用名称映射至 `--product-name`,补充 `--product-version` 参数。
@@ -380,7 +396,7 @@ QPyPack 项目的所有重要变更都将记录在此文件中。
## [2.3.5] - 2026-06-17
* **防漏包机制**:重构依赖拉取架构为“三重绝对安全网”(`Requirements -> Pipreqs -> AST 源码强扫`),彻底解决漏包闪退问题。
* **防漏包机制**:重构依赖拉取架构为“三重绝对安全网”(`Requirements -> Pipreqs -> AST 源码强扫`),解决漏包闪退问题。
* **工作区零污染**:配置文件迁移至全局路径 `~/.qpypack/config.ini`,所有中间产物转移至系统 Temp 目录。
* **构建日志规范化**:引入规范的 CI/CD 生命周期状态标签 (`[Init]`, `[Env]`, `[Deps]`, `[Build]`, `[Pack]`)。
* **虚拟环境沙盒智能自愈**:分配隔离 venv 后自动升级 pip,清除老旧模块的大段警告乱码。
+15 -1
View File
@@ -9,7 +9,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
---
# Changelog
## [2.7.12] - 2026-08-25
### Added
- **Expanded Package Mappings & Cloud Warnings**: Added mappings for `pkg_resources`, `protobuf`, `pydantic-core`, etc., in `DEFAULT_MAPPINGS` to prevent package resolution errors; added security warnings for Quark Cloud Sync directories.
- **Enhanced GUI Framework Detection**: Added `qtpy`, `pyglet`, `toga`, and `pyqtgraph` to GUI auto-detection for accurate "Hide Console" flag toggling.
- **Upgraded Python Installation Matrix**: Refactored the built-in installer catalog and support lifecycle for Python 3.14+ runtimes, optimizing version compatibility and recommendation strategies.
### Changed
- **Default Nuitka Anti-Bloat Strategy**: Enabled the `anti-bloat` plugin and baseline exclusions (`unittest`, `pytest`, `IPython`, etc.) by default to resolve abnormal binary size inflation in Compatibility Mode.
- **Expanded Auto-Resource Collection**: Added automatic resource gathering rules for `pyecharts` and `pyppeteer` across both PyInstaller and Nuitka to prevent missing HTML assets and headless browser binaries.
- **Hardened UPX Dynamic Library Whitelist**: Expanded UPX exclusion rules to cover `Qt5`, `sqlite3.dll`, and `libcrypto/libssl`, preventing crashes in database access and HTTPS networking.
### Fixed
- **Fixed Cloud Sync & Antivirus File Lock Failures**: Removed Nuitka's strict `--remove-output` flag and delegated cleanup to QPyPack's non-blocking cleanup routine, preventing `FATAL` build errors caused by OneDrive file locks or background security scans.
- **Fixed False-Positive Standard Library Installation**: Added missing `traceback` and `warnings` modules to the fallback standard library manifest, preventing pip from attempting to download built-in modules on older Python versions like 3.9.
---
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "qpypack"
version = "2.7.11"
version = "2.7.12"
description = "A cross-platform GUI packaging and compilation suite based on PyInstaller and Nuitka."
readme = "README_EN.md"
authors = [
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "اسم حزمة PyPI",
"PyPI package name for [{imp_name}]:": "اسم حزمة PyPI لـ [{imp_name}]:",
"Python 3.10.11": "بايثون 3.10.11",
"Python 3.11.10 (Recommended)": "بايثون 3.11.10 (موصى به)",
"Python 3.11.9 (Recommended)": "بايثون 3.11.9 (موصى به)",
"Python 3.12.4": "بايثون 3.12.4",
"Python 3.12.9": "بايثون 3.12.9",
"Python 3.13.0": "بايثون 3.13.0",
"Python 3.13.5 (Stable)": "بايثون 3.13.5 (مستقر)",
"Python 3.14.3 (Newest)": "بايثون 3.14.3 (الأحدث)",
"Python 3.14.6 (Experimental)": "بايثون 3.14.6 (تجريبي)",
"Python 3.8.10 (Win7 Support)": "بايثون 3.8.10 (دعم ويندوز 7)",
"Python 3.9.13": "بايثون 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "PyPI-Paketname",
"PyPI package name for [{imp_name}]:": "PyPI-Paketname für [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Empfohlen)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Empfohlen)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Stabil)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Neueste)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Experimentell)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7-Unterstützung)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "Nombre del paquete PyPI",
"PyPI package name for [{imp_name}]:": "Nombre del paquete PyPI para [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Recomendado)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Recomendado)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Estable)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Más reciente)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Experimental)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Soporte Win7)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "Nom du paquet PyPI",
"PyPI package name for [{imp_name}]:": "Nom du paquet PyPI pour [{imp_name}] :",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Recommandé)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (recommandé)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Stable)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Le plus récent)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (expérimental)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (support Win7)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "Nome pacchetto PyPI",
"PyPI package name for [{imp_name}]:": "Nome pacchetto PyPI per [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Consigliato)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Consigliato)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Stabile)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Più recente)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Sperimentale)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Supporto Win7)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -202,9 +202,13 @@
"PyPI Package Name": "PyPIパッケージ名",
"PyPI package name for [{imp_name}]:": "[{imp_name}] のPyPIパッケージ名:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10(推奨)",
"Python 3.11.9 (Recommended)": "Python 3.11.9(推奨)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5(安定版)",
"Python 3.14.3 (Newest)": "Python 3.14.3(最新)",
"Python 3.14.6 (Experimental)": "Python 3.14.6(実験的)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10(Win7サポート)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "PyPI 패키지 이름",
"PyPI package name for [{imp_name}]:": "[{imp_name}]의 PyPI 패키지 이름:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (권장)",
"Python 3.11.9 (Recommended)": "Python 3.11.9(권장)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (안정 버전)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (최신)",
"Python 3.14.6 (Experimental)": "Python 3.14.6(실험적)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10(Win7 지원)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "PyPI-pakketnaam",
"PyPI package name for [{imp_name}]:": "PyPI-pakketnaam voor [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Aanbevolen)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Aanbevolen)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Stabiel)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Nieuwste)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Experimenteel)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7-ondersteuning)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "Nazwa pakietu PyPI",
"PyPI package name for [{imp_name}]:": "Nazwa pakietu PyPI dla [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Zalecana)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Zalecany)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Stabilna)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Najnowsza)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Eksperymentalny)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Wsparcie Win7)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "Nome do Pacote PyPI",
"PyPI package name for [{imp_name}]:": "Nome do pacote PyPI para [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Recomendado)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Recomendado)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Estável)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Mais recente)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Experimental)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Suporte ao Win7)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "Имя пакета PyPI",
"PyPI package name for [{imp_name}]:": "Имя пакета PyPI для [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (рекомендуется)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (рекомендуется)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (стабильная)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (самая новая)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (экспериментально)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (поддержка Win7)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "ชื่อแพ็กเกจ PyPI",
"PyPI package name for [{imp_name}]:": "ชื่อแพ็กเกจ PyPI สำหรับ [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (แนะนำ)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (แนะนำ)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (เสถียร)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (ใหม่ล่าสุด)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (ทดลอง)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (รองรับ Win7)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "PyPI Paket Adı",
"PyPI package name for [{imp_name}]:": "[{imp_name}] için PyPI paket adı:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Önerilen)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Önerilen)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Kararlı)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (En Yeni)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Deneysel)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7 Desteği)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -205,9 +205,13 @@
"PyPI Package Name": "Tên gói PyPI",
"PyPI package name for [{imp_name}]:": "Tên gói PyPI cho [{imp_name}]:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10 (Khuyến nghị)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (Khuyến nghị)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5 (Ổn định)",
"Python 3.14.3 (Newest)": "Python 3.14.3 (Mới nhất)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (Thử nghiệm)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Hỗ trợ Win7)",
"Python 3.9.13": "Python 3.9.13",
+5 -1
View File
@@ -164,7 +164,7 @@
"No log content.": "无日志内容。",
"Nuitka Version:": "Nuitka 版本:",
"Nuitka — Compiles source code into native C/C++ binary. Produces smaller package size, faster execution, and deep anti-decompilation protection (requires C compiler).": "Nuitka — 编译为原生 C/C++ 二进制。体积更小,执行更快,具备强抗反编译能力 (需 C 编译器)。",
"OK": "OK",
"OK": "确定",
"OS Support Matrix:": "支持操作系统情况::",
"Obsolete Backport Exclusion Rules": "废弃兼容包拦截规则",
"One-Click Download & Install": "下载并自动安装",
@@ -205,9 +205,13 @@
"PyPI Package Name": "PyPI 包名",
"PyPI package name for [{imp_name}]:": "[{imp_name}] 对应 PyPI 包名:",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10(推荐)",
"Python 3.11.9 (Recommended)": "Python 3.11.9 (推荐)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5(稳定版)",
"Python 3.14.3 (Newest)": "Python 3.14.3(最新版)",
"Python 3.14.6 (Experimental)": "Python 3.14.6 (实验性)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10 (Win7 兼容)",
"Python 3.9.13": "Python 3.9.13",
+4
View File
@@ -204,9 +204,13 @@
"PyPI Package Name": "PyPI 套件名稱",
"PyPI package name for [{imp_name}]:": "[{imp_name}] 的 PyPI 套件名稱::",
"Python 3.10.11": "Python 3.10.11",
"Python 3.11.10 (Recommended)": "Python 3.11.10(建議)",
"Python 3.11.9 (Recommended)": "Python 3.11.9(建議)",
"Python 3.12.4": "Python 3.12.4",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.0": "Python 3.13.0",
"Python 3.13.5 (Stable)": "Python 3.13.5(穩定版)",
"Python 3.14.3 (Newest)": "Python 3.14.3(最新)",
"Python 3.14.6 (Experimental)": "Python 3.14.6(實驗性)",
"Python 3.8.10 (Win7 Support)": "Python 3.8.10(支援 Win7)",
"Python 3.9.13": "Python 3.9.13",
+42 -33
View File
@@ -61,7 +61,7 @@ except ImportError:
HAS_QT_AUDIO = False
__app_name__ = "QPyPack"
__version__ = "2.7.11"
__version__ = "2.7.12"
__author__ = "QwejayHuang"
__company__ = "QwejayHuang"
__description__ = "Modern Cross-Platform Python Packaging GUI Powered by PyInstaller & Nuitka"
@@ -520,6 +520,10 @@ ZH_CN_DICT = {
"Resource not found: {path}": "资源未找到:{path}",
"Script file is locked by cloud sync": "脚本文件被云同步锁定",
"[Syntax Error] Source code syntax parsing failed, build aborted:\n - File: {file}\n - Detail: {desc}\n\nTip: This is usually NOT a fault of the packaging tool.\nPlease ensure the [Build Python Version] you selected matches the version you used to [Write/Test the Code].\nUsing newer syntax (e.g., walrus operator :=, type unions |, match-case) in an older Python environment will trigger this error.\nWe recommend going to [Build Settings] -> [Engine] to switch to the correct Python version.": "[Syntax Error] 源代码语法解析失败,构建中止:\n - 文件:{file}\n - 详情:{desc}\n\n提示:这通常不是打包工具的故障。\n请确保您选择的 [构建 Python 版本] 与您用于 [编写/测试代码] 的版本匹配。\n在较旧的 Python 环境中使用较新的语法(例如海象运算符 :=、类型联合 |、match-case)将触发此错误。\n我们建议您前往 [构建设置] -> [引擎] 切换到正确的 Python 版本。",
"Python 3.11.10 (Recommended)": "Python 3.11.10(推荐)",
"Python 3.12.9": "Python 3.12.9",
"Python 3.13.5 (Stable)": "Python 3.13.5(稳定版)",
"Python 3.14.3 (Newest)": "Python 3.14.3(最新版)",
"Unknown": "未知"
}
@@ -716,7 +720,15 @@ DEFAULT_MAPPINGS = {
'OpenSSL': 'pyOpenSSL', 'ldap': 'python-ldap', 'magic': 'python-magic', 'slugify': 'python-slugify',
'snappy': 'python-snappy',
'attr': 'attrs', 'psycopg2': 'psycopg2-binary'
'attr': 'attrs', 'psycopg2': 'psycopg2-binary',
'pkg_resources': 'setuptools',
'google.protobuf': 'protobuf',
'dotenv': 'python-dotenv',
'jwt': 'PyJWT',
'cx_Oracle': 'cx-Oracle',
'mysql': 'mysql-connector-python',
'pydantic_core': 'pydantic-core',
}
DEFAULT_BACKPORT_RULES = {
@@ -985,7 +997,8 @@ def is_cloud_sync_path(path_obj: Path) -> bool:
'onedrive', 'dropbox', 'icloud', 'google drive', 'googledrive', 'gdrive',
'box sync', 'box.com', 'pcloud', 'mega', 'megasync', 'nextcloud', 'owncloud',
'synology', 'seafile', 'tresorit', 'yandex',
'nutstore', '坚果云', '百度云', '百度网盘', '阿里云盘', 'aliyun', '115', '微云'
'nutstore', '坚果云', '百度云', '百度网盘', '阿里云盘', 'aliyun', '115', '微云',
'quark', '夸克网盘', '夸克'
]
return any(kw in path_str for kw in cloud_keywords)
@@ -1438,8 +1451,8 @@ def get_stdlib_names():
'string', 'stringprep', 'struct', 'subprocess', 'sunau', 'symbol', 'symtable', 'sys',
'sysconfig', 'syslog', 'tabnanny', 'tarfile', 'telnetlib', 'tempfile', 'termios', 'textwrap',
'threading', 'time', 'timeit', 'tkinter', 'token', 'tokenize', 'tomllib', 'trace',
'tracemalloc', 'tty', 'turtle', 'turtledemo', 'types', 'typing', 'unicodedata', 'unittest',
'urllib', 'uu', 'uuid', 'venv', 'wave', 'weakref', 'webbrowser', 'winreg', 'winsound',
'traceback', 'tracemalloc', 'tty', 'turtle', 'turtledemo', 'types', 'typing', 'unicodedata', 'unittest',
'urllib', 'uu', 'uuid', 'venv', 'warnings', 'wave', 'weakref', 'webbrowser', 'winreg', 'winsound',
'wsgiref', 'xdrlib', 'xml', 'xmlrpc', 'zipapp', 'zipfile', 'zipimport', 'zlib', 'zoneinfo',
'__future__', '_thread', '_asyncio'
}
@@ -4051,7 +4064,6 @@ class SettingsPanel(QWidget):
return self.parent_win.show_error_log(_("[ERROR] Target file is locked or encrypted by cloud drive. Please decrypt and try again."))
try:
# 联动界面勾选的“扫描整个文件夹”状态
scan_dir = self.pipreqs_dir_check.isChecked()
target = Path(script_path).parent if scan_dir else Path(script_path)
hidden = extract_project_imports_via_ast(target, scan_dir=scan_dir)
@@ -4741,7 +4753,6 @@ class PackingThread(QThread):
script_dir = script_path.parent
system_python_exe = self.params.get('python_exe')
# 使用选定的目标 Python 进行语法预检,避免高低版本语法特性误杀
if system_python_exe and os.path.exists(system_python_exe):
try:
kw_chk = {"capture_output": True, "text": True, "timeout": 5, "errors": "ignore"}
@@ -5250,15 +5261,19 @@ class PackingThread(QThread):
if os.name == "nt":
cmd.extend([
"--upx-exclude=python3.dll",
"--upx-exclude=vcruntime140.dll",
"--upx-exclude=vcruntime140_1.dll",
"--upx-exclude=vcruntime*.dll",
"--upx-exclude=ucrtbase.dll",
"--upx-exclude=msvcp140.dll",
"--upx-exclude=msvcp140_1.dll",
"--upx-exclude=msvcp*.dll",
"--upx-exclude=Qt6Core.dll",
"--upx-exclude=Qt6Gui.dll",
"--upx-exclude=Qt6Widgets.dll",
"--upx-exclude=qwindows.dll"
"--upx-exclude=Qt5Core.dll",
"--upx-exclude=Qt5Gui.dll",
"--upx-exclude=Qt5Widgets.dll",
"--upx-exclude=qwindows.dll",
"--upx-exclude=sqlite3.dll",
"--upx-exclude=libcrypto*.dll",
"--upx-exclude=libssl*.dll"
])
try:
kw = {"capture_output": True, "text": True, "timeout": 3, "errors": "ignore"}
@@ -5299,20 +5314,24 @@ class PackingThread(QThread):
cmd.extend(["--collect-data", "certifi"])
self.progress.emit(_("[WARN] Detected 'requests' or 'httpx'. Auto-bundling 'certifi' certificates to prevent SSL errors."))
for web_fw in ('fastapi', 'uvicorn', 'flask', 'streamlit', 'pywebio', 'dash'):
for web_fw in ('fastapi', 'uvicorn', 'flask', 'streamlit', 'pywebio', 'dash', 'pyecharts', 'pyppeteer'):
if web_fw in all_imports_lower:
cmd.extend(["--collect-all", web_fw])
elif engine == "Nuitka":
self.temp_out_dir = Path(tempfile.mkdtemp(prefix="qpypack_nuitka_", dir=temp_dir_arg)).resolve()
cmd = [
python_exe, "-m", "nuitka", "--remove-output", "--assume-yes-for-downloads",
python_exe, "-m", "nuitka", "--assume-yes-for-downloads",
"--enable-plugin=anti-bloat",
f"--output-dir={self.temp_out_dir.as_posix()}",
f"--output-filename={app_name}{ext}"
]
base_nuitka_excludes = ['unittest', 'doctest', 'pdb', 'pydoc', 'test', 'pytest', 'IPython', 'setuptools']
for ex in base_nuitka_excludes:
cmd.append(f"--nofollow-import-to={ex}")
if os.name == "nt":
# 1. 精确获取打包 Python 的版本与架构位数
py_ver_num = (3, 8)
is_64bit = True
try:
@@ -5327,14 +5346,12 @@ class PackingThread(QThread):
is_64bit = (arch_part.lower() == 'true')
except Exception: pass
# 2. 精确检测 MSVC 以及是否安装了 Windows SDK
has_suitable_msvc = False
has_win_sdk = False
vswhere = Path(os.environ.get("ProgramFiles(x86)", "C:\\Program Files (x86)")) / "Microsoft Visual Studio/Installer/vswhere.exe"
if vswhere.exists():
try:
# Python 3.11+ 必须 VS 2022 (v17.0+ / MSVC 14.3+);3.8-3.10 支持 VS 2017/2019/2022
min_vs_ver = "17.0" if py_ver_num >= (3, 11) else "15.0"
res_vc = subprocess.run([
vswhere.as_posix(), "-latest", "-version", min_vs_ver,
@@ -5344,7 +5361,6 @@ class PackingThread(QThread):
has_suitable_msvc = True
except Exception: pass
# 修复:直接扫描标准系统 SDK 路径(防止 vswhere 检索范围局限在 VS 目录导致误判)
sdk_paths = [
Path(os.environ.get("ProgramFiles(x86)", "C:\\Program Files (x86)")) / "Windows Kits" / "10" / "Lib",
Path(os.environ.get("ProgramFiles(x86)", "C:\\Program Files (x86)")) / "Windows Kits" / "11" / "Lib",
@@ -5356,18 +5372,14 @@ class PackingThread(QThread):
has_win_sdk = True
break
# 3. 全版本编译器分流矩阵
# 规则 A: 拥有合规 MSVC 且包含 SDK -> 优先使用 MSVC
if has_suitable_msvc and has_win_sdk:
cmd.append("--msvc=latest")
self.progress.emit(_("[INFO] Found compatible MSVC + Windows SDK environment, using native compiler."))
# 规则 B: Python 3.13+ 并且是 64 位环境 -> 优先使用 Zig 编译器 (MinGW64 在 3.13+ 已废弃)
elif py_ver_num >= (3, 13) and is_64bit:
cmd.append("--zig")
self.progress.emit(_("[INFO] Python 3.13+ detected: Using Zig compiler (--zig) as native backend."))
# 规则 C: Python 3.8 ~ 3.12 -> 使用/自动下载 MinGW64 (winlibs)
elif py_ver_num <= (3, 12):
cmd.append("--mingw64")
if not has_suitable_msvc and py_ver_num >= (3, 11):
@@ -5375,7 +5387,6 @@ class PackingThread(QThread):
else:
self.progress.emit(_("[INFO] Using MinGW64 compiler."))
# 规则 D: Python 3.13+ 且为 32位系统,但缺失 VS2022
else:
cmd.append("--msvc=latest")
self.progress.emit(_("[WARN] Python 3.13+ (32-bit) requires Visual Studio 2022 with Windows SDK. Build will attempt with current environment."))
@@ -5478,7 +5489,7 @@ class PackingThread(QThread):
cmd.append("--include-package-data=certifi")
self.progress.emit(_("[WARN] Detected 'requests' or 'httpx'. Auto-bundling 'certifi' certificates to prevent SSL errors."))
for web_fw in ('fastapi', 'uvicorn', 'flask', 'streamlit', 'pywebio', 'dash'):
for web_fw in ('fastapi', 'uvicorn', 'flask', 'streamlit', 'pywebio', 'dash', 'pyecharts', 'pyppeteer'):
if web_fw in imports_lower:
if not is_lite: cmd.append(f"--include-package={web_fw}")
cmd.append(f"--include-package-data={web_fw}")
@@ -5513,8 +5524,7 @@ class PackingThread(QThread):
cmd.append(f"--exclude-module={ex}")
elif engine == "Nuitka":
cmd.append("--python-flag=-OO")
cmd.append("--enable-plugin=anti-bloat")
nuitka_dev_excludes = ['unittest', 'doctest', 'pdb', 'pydoc', 'test', 'pytest', 'IPython', 'binder', 'tkinter.test', 'pip', 'setuptools', 'wheel']
nuitka_dev_excludes = ['binder', 'tkinter.test', 'pip', 'wheel', 'distutils', 'pkg_resources', 'jupyter', 'notebook', 'IPython']
for ex in nuitka_dev_excludes:
cmd.append(f"--nofollow-import-to={ex}")
@@ -5606,7 +5616,6 @@ class PackingThread(QThread):
self.progress.emit(_("[INFO] Compilation completed, archiving built files..."))
try:
if src_out.resolve() != final_out.resolve():
# 若目标路径已存在旧文件/文件夹,先安全彻底删除
if final_out.exists():
if final_out.is_dir():
if not robust_rmtree(final_out):
@@ -5618,7 +5627,6 @@ class PackingThread(QThread):
time.sleep(1)
final_out.unlink(missing_ok=True)
# 确保旧产物已彻底不存在后再移动,避免 onedir 模式下将目录移入自身产生嵌套
for _retry in range(15):
try:
shutil.move(src_out.as_posix(), final_out.as_posix())
@@ -5864,10 +5872,10 @@ class PythonInstallerDialog(QDialog):
lay_dl.setSpacing(10)
self.versions = [
("3.14.6", _("Python 3.14.6 (Experimental)")),
("3.13.0", _("Python 3.13.0")),
("3.12.4", _("Python 3.12.4")),
("3.11.9", _("Python 3.11.9 (Recommended)")),
("3.14.3", _("Python 3.14.3 (Newest)")),
("3.13.5", _("Python 3.13.5 (Stable)")),
("3.12.9", _("Python 3.12.9")),
("3.11.10", _("Python 3.11.10 (Recommended)")),
("3.10.11", _("Python 3.10.11")),
("3.9.13", _("Python 3.9.13")),
("3.8.10", _("Python 3.8.10 (Win7 Support)")),
@@ -6560,7 +6568,8 @@ class MainWindow(QMainWindow):
gui_libs = {
'pyqt5', 'pyqt6', 'pyside2', 'pyside6', 'tkinter', 'wx', 'kivy', 'libavg',
'pysimplegui', 'customtkinter', 'turtle', 'easygui', 'pygame', 'arcade',
'dearpygui', 'flet', 'webview', 'remi'
'dearpygui', 'flet', 'webview', 'remi',
'qtpy', 'pyglet', 'toga', 'pyqtgraph'
}
has_gui = any(lib in {m.lower() for m in script_imports} for lib in gui_libs)