Awespykit 2.2.0
本次为重构版本:界面布局与操作方式保持不变,已有的配置文件可以继续使用。主要内容是让代码结构恢复可维护性,并修掉一批会在使用中真实碰到的问题。
重构:包内导入规范化
原先包内把 com / logic / settings / ui / utils 当作顶层模块导入(例如 from utils.thmt import ...),共 44 处。这种写法有三个实际后果:
- 用户环境里只要装了同名的第三方包,程序会直接启动失败。PyPI 上确实存在一个叫 utils 的包,报错为 ModuleNotFoundError: No module named 'utils.thmt';
- 必须先手工把包目录塞进 sys.path 才能工作,换个启动方式就可能失败;
- 子包之间无法表达依赖关系,改动时容易踩坑。
现已全部改为规范的包内导入。
修复
含相对导入的文件,「检查导入」功能完全失效
from . import x 这类相对导入会让导入扫描器抛异常,而调用方把整个文件的解析包在 try 里 —— 结果是含相对导入的文件,其全部依赖被静默丢弃,用户看不到任何缺失模块的提示。相对导入在真实项目里非常常见,这个功能等于对它们不工作。
停止任务实际停不下来,可能损坏 Python 环境
工作线程直接执行普通函数、从不调用 exec(),因此 quit() 对它们完全无效(实测确认)。但界面提示写着「尝试停止所有正在运行的任务」,用户看到后就会强退程序,而此时 pip 可能正处在安装、卸载的中间步骤,中断会留下装了一半的包、损坏该环境。
现在会先给线程自行退出的机会,再强制终止并等待其真正结束;提示文案也如实说明风险。
依赖版本不符时「双击没反应」
打包成 exe 后没有控制台窗口,而 fastpip 版本不符时原实现直接抛异常 —— 异常信息写进 stderr 却没人看得到,用户双击图标只见进程一闪而过。现在改为弹窗说明当前版本、要求版本和解决办法。
配置损坏会让程序行为异常
配置文件是 JSON,可能被手工改坏或被覆盖。原先这些异常值会被直接交给界面:字符串型的列表字段会被按字符遍历(abc 变成 a、b、c)、负数的窗口尺寸被传给 resize()、枚举字段退化成裸数字导致访问 .name 时出错。现在统一还原为合法值,坏值一律回退默认值 —— 实测八种损坏形态都能正常启动。
路径处理
- 排除目录用前缀比较,把 C:/project 误判成 C:/proj 的子目录,导致该检查的源码被跳过;现按路径分量判断。
- 镜像源校验只接受 https 且必须以 /simple 结尾,误拒 http 内网源和 PyTorch 官方轮子站这类合法地址。
子进程启动失败未捕获
两处 Popen 没有异常保护:Python 环境被删除或路径失效时,FileNotFoundError 会直接打断版本探测和打包流程,界面毫无反应。现在会捕获并给出可操作的提示。
配置保存失败被静默吞掉
写配置失败(磁盘满、目录只读、被杀毒软件拦截)时原先 except: pass,用户只会觉得「设置怎么又没记住」。现在会明确告知。
其他
- com 与 utils.thmt 之间存在循环导入,原先靠导入顺序侥幸成立,换个导入顺序就会崩;已解除。
- 裸 except 收窄为具体异常,避免连 KeyboardInterrupt 一起吞掉。
- 拖放文件后滚动条不会滚到底部(用了控件高度而非滚动范围)。
- 窗口最大化时仍会记录尺寸,导致下次还原大小不对。
工程化
测试从 5 个增加到 15 个,覆盖:三种启动方式(含直接运行脚本)、Qt 资源加载、同名第三方包遮蔽、fastpip 版本守卫。已验证这些测试能捕获回归。
产物
| 文件 | 说明 |
|---|---|
| Awespykit.exe | Windows 单文件可执行程序,双击即可运行,无需安装 Python |
| Awespykit.exe.sha256 | exe 的 SHA256 校验和 |
| awespykit-2.2.0-py3-none-any.whl | Python 分发包(pip install 用) |
| awespykit-2.2.0.tar.gz | 源码分发包 |
| python-dist.sha256 | 两个 Python 分发包的 SHA256 校验和 |
也可以直接用 pip install Awespykit -U。