diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e9f1df..374b753 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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,清除老旧模块的大段警告乱码。 diff --git a/CHANGELOG_EN.md b/CHANGELOG_EN.md index 5c218c0..599e759 100644 --- a/CHANGELOG_EN.md +++ b/CHANGELOG_EN.md @@ -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. --- diff --git a/pyproject.toml b/pyproject.toml index df477a8..e7dfa0d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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 = [ diff --git a/qpypack/locales/ar_SA.json b/qpypack/locales/ar_SA.json index 98c8f79..5a8bcff 100644 --- a/qpypack/locales/ar_SA.json +++ b/qpypack/locales/ar_SA.json @@ -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", diff --git a/qpypack/locales/de_DE.json b/qpypack/locales/de_DE.json index 3f5bd70..33c7b43 100644 --- a/qpypack/locales/de_DE.json +++ b/qpypack/locales/de_DE.json @@ -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", diff --git a/qpypack/locales/es_ES.json b/qpypack/locales/es_ES.json index 1bb7f47..e4ca486 100644 --- a/qpypack/locales/es_ES.json +++ b/qpypack/locales/es_ES.json @@ -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", diff --git a/qpypack/locales/fr_FR.json b/qpypack/locales/fr_FR.json index 657b37f..6199723 100644 --- a/qpypack/locales/fr_FR.json +++ b/qpypack/locales/fr_FR.json @@ -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", diff --git a/qpypack/locales/it_IT.json b/qpypack/locales/it_IT.json index f2c2c21..2701bc9 100644 --- a/qpypack/locales/it_IT.json +++ b/qpypack/locales/it_IT.json @@ -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", diff --git a/qpypack/locales/ja_JP.json b/qpypack/locales/ja_JP.json index 8455fbf..4050248 100644 --- a/qpypack/locales/ja_JP.json +++ b/qpypack/locales/ja_JP.json @@ -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", diff --git a/qpypack/locales/ko_KR.json b/qpypack/locales/ko_KR.json index cb1b0bf..1f77616 100644 --- a/qpypack/locales/ko_KR.json +++ b/qpypack/locales/ko_KR.json @@ -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", diff --git a/qpypack/locales/nl_NL.json b/qpypack/locales/nl_NL.json index 13109a4..8359566 100644 --- a/qpypack/locales/nl_NL.json +++ b/qpypack/locales/nl_NL.json @@ -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", diff --git a/qpypack/locales/pl_PL.json b/qpypack/locales/pl_PL.json index 539daf7..3aa95cc 100644 --- a/qpypack/locales/pl_PL.json +++ b/qpypack/locales/pl_PL.json @@ -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", diff --git a/qpypack/locales/pt_BR.json b/qpypack/locales/pt_BR.json index 9a2d4fc..5a39b67 100644 --- a/qpypack/locales/pt_BR.json +++ b/qpypack/locales/pt_BR.json @@ -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", diff --git a/qpypack/locales/ru_RU.json b/qpypack/locales/ru_RU.json index 711d695..a92a692 100644 --- a/qpypack/locales/ru_RU.json +++ b/qpypack/locales/ru_RU.json @@ -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", diff --git a/qpypack/locales/th_TH.json b/qpypack/locales/th_TH.json index 418afcb..55b0cf9 100644 --- a/qpypack/locales/th_TH.json +++ b/qpypack/locales/th_TH.json @@ -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", diff --git a/qpypack/locales/tr_TR.json b/qpypack/locales/tr_TR.json index e75a238..91fc5d8 100644 --- a/qpypack/locales/tr_TR.json +++ b/qpypack/locales/tr_TR.json @@ -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", diff --git a/qpypack/locales/vi_VN.json b/qpypack/locales/vi_VN.json index 0411b14..1206c9b 100644 --- a/qpypack/locales/vi_VN.json +++ b/qpypack/locales/vi_VN.json @@ -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", diff --git a/qpypack/locales/zh_CN.json b/qpypack/locales/zh_CN.json index dd8e745..2abcb1a 100644 --- a/qpypack/locales/zh_CN.json +++ b/qpypack/locales/zh_CN.json @@ -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", diff --git a/qpypack/locales/zh_TW.json b/qpypack/locales/zh_TW.json index 4036817..c1808ba 100644 --- a/qpypack/locales/zh_TW.json +++ b/qpypack/locales/zh_TW.json @@ -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", diff --git a/qpypack/main.py b/qpypack/main.py index fdea1a5..f4f9fd1 100644 --- a/qpypack/main.py +++ b/qpypack/main.py @@ -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)