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:
1 parent
8d4282e348
commit
51b1f78b72
20 files changed
+151
-48
No files matched your search
+28
-12
@@ -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
@@ -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
@@ -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 = [
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user