Releases: laincat/AwesomePyKit
Release list
Awespykit 2.3.1
界面文案调整:关于页面现在区分原作者与维护者。
原作者: hrp/hrpzcf
维护者: Laincat
同时也修正了几处会把用户带偏的地方 —— 原作者自 2024-10 停更,原有链接指向的仓库不会再有任何更新:
- 程序版本、开源协议、源代码、问题反馈的点击目标全部改指本仓库;
- 原界面写着「Gitee / Gitee Issues」,但那两个链接实际都指向 GitHub,文案与落点不符。现改为每行一个链接(GitHub / GitHub Issues);
- 「使用的开源库」中 fastpip 的主页改指本仓库的 src/fastpip/ —— 它已并入本项目维护,上游仓库不会再更新。
功能上没有任何变化,界面布局保持原样,只是多了一行维护者信息。
安装方式
PyPI 上的
Awespykit由原作者持有,仍停在 2.1.0,请用下面地址安装本仓库的版本。
pip install https://github.com/laincat/AwesomePyKit/releases/download/2.3.1/awespykit-2.3.1-py3-none-any.whl
exe 版直接下载下面的 Awespykit.exe 双击运行,无需安装 Python。
产物
| 文件 | 说明 |
|---|---|
| Awespykit.exe | Windows 单文件可执行程序 |
| Awespykit.exe.sha256 | exe 的 SHA256 校验和 |
| awespykit-2.3.1-py3-none-any.whl | Python 分发包 |
| awespykit-2.3.1.tar.gz | 源码分发包 |
| python-dist.sha256 | 两个 Python 分发包的 SHA256 |
Awespykit 2.3.0
本次发布包含两项实质改动,其中下载体积减少约三分之一。
exe 体积:42.9 MB → 28.1 MB(-34%)
本程序是纯 QtWidgets 界面,代码里只用到 QtCore / QtGui / QtWidgets 三个模块,但 PyQt5 的打包 hook 会把整套 Qt5 运行库都收进来。已排除确定用不到的部分:
- QML / Quick 引擎(约 7.8 MB)—— 程序未使用 QML
- 软件 OpenGL 回退 opengl32sw.dll(20 MB)—— 已实测,设置 QT_OPENGL=software 时程序仍正常
- ANGLE 相关(libGLESv2、libEGL)与 d3dcompiler_47
- 网络 / WebSocket / DBus / 定位 / 多媒体 / SQL / 蓝牙 / NFC 等模块
- 未使用的图片格式插件(tiff、webp、tga、wbmp、icns、svg)—— 程序只用 PNG 与 GIF
保留了 qwindows / qminimal / qoffscreen 三个平台插件(offscreen 是自动化测试依赖的)。功能验证覆盖三种场景:普通桌面、无显示器环境、虚拟机/远程桌面。
fastpip 改为随程序一起维护
fastpip 是包管理功能的核心依赖,由同一位原作者维护,自 2023-03 起停止更新。其源码里存在无效转义序列:Python 3.12 起会报 SyntaxWarning,而后续版本计划升级为 SyntaxError —— 一旦成为硬错误,fastpip 将无法导入,本程序也随之启动不了。
现已把它的源码并入本项目(src/fastpip/)一并维护:
- 修掉上述转义问题;
- 版本号记为 1.7.1,与上游 1.7.0 区分;
- 保留上游 MIT 许可与署名。
顺带修掉一个隐蔽的冲突:原先 requirements.txt 声明了 fastpip,pip 会从 PyPI 再装一份同名包,与本仓库副本装进同一目录互相覆盖 —— 实际生效的是哪一份取决于安装顺序。现已移除该声明,并补上它原本自动带入的 psutil。
功能已在 Python 3.9 与 3.14 上分别实测:列包、版本探测、导入名映射、安装、卸载、下载 wheel、导出 requirements、查可升级,全部正常。
安装方式
PyPI 上的
Awespykit由原作者持有,仍停在 2.1.0,请用下面地址安装本仓库的版本。
pip install https://github.com/laincat/AwesomePyKit/releases/download/2.3.0/awespykit-2.3.0-py3-none-any.whl
exe 版直接下载下面的 Awespykit.exe 双击运行,无需安装 Python。
产物
| 文件 | 说明 |
|---|---|
| Awespykit.exe | Windows 单文件可执行程序 |
| Awespykit.exe.sha256 | exe 的 SHA256 校验和 |
| awespykit-2.3.0-py3-none-any.whl | Python 分发包 |
| awespykit-2.3.0.tar.gz | 源码分发包 |
| python-dist.sha256 | 两个 Python 分发包的 SHA256 |
Awespykit 2.2.1
本次修复两个影响日常使用的问题。
修复:点右上角关闭按钮会崩溃
现象:点任意子窗口(包管理器、程序打包工具、镜像源设置、安装包下载器、云函数打包)右上角的 X,程序直接消失,没有任何提示。有时又不崩。
原因是两处叠加:
-
这些窗口在关闭时会调用一个函数来保存配置,但该函数名没有被导入。这行代码一执行就抛 NameError,而它运行在 Qt 的 C++ 事件处理里,Python 异常无法向上传播,只能直接崩掉进程 —— 所以看不到任何报错信息。
-
判断「是否有任务在运行」的逻辑只检查线程列表的长度,不检查线程是否真的还在运行。已经结束、但尚未被清理定时器移除的线程会被误判成运行中,于是关闭时试图弹出「任务正在进行」的对话框。在关闭流程里弹模态对话框会让 Qt 重入事件循环,同样导致崩溃。
第 2 点解释了为什么是不定时崩溃:是否触发取决于清理定时器有没有恰好跑过。现在按语义判断「是否有仍在运行的线程」,不再依赖定时器时机。
修复:启动窗口默认尺寸与内容不符
现象:启动窗口默认是一个窄高的竖条,图标挤成两列;必须先把它横向拉宽再缩回去,才会变成应该有的扁矩形(README 截图里的样子)。
原因:窗口的按钮是横向排列的,自然尺寸约 324x100,但默认尺寸写死成了 (260, 320) —— 一个竖长条。
现在首次启动按内容自然尺寸显示;你调整过尺寸后仍会照常记住。配置若被改坏(负数、字符串、长度不对)会回退到自适应,不会出现异常窗口。
测试
新增针对「关闭窗口」的回归测试:在独立子进程里逐个开关全部窗口,进程退出码非 0 即视为失败(这类崩溃只发生在底层,普通单元测试抓不到)。两个新测试都做过反向验证 —— 把代码改回旧写法时确实会失败。测试总数 15 -> 17。
产物
| 文件 | 说明 |
|---|---|
| Awespykit.exe | Windows 单文件可执行程序,双击即可运行,无需安装 Python |
| Awespykit.exe.sha256 | exe 的 SHA256 校验和 |
| awespykit-2.2.1-py3-none-any.whl | Python 分发包 |
| awespykit-2.2.1.tar.gz | 源码分发包 |
| python-dist.sha256 | 两个 Python 分发包的 SHA256 校验和 |
安装(PyPI 上的同名包不归本仓库所有,请用下面地址):
pip install https://github.com/laincat/AwesomePyKit/releases/download/2.2.1/awespykit-2.2.1-py3-none-any.whl
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。
Awespykit 2.1.1
本次发布主要是修复若干缺陷,并补齐自动化(CI、发布流程、依赖更新)。所有产物由 GitHub Actions 构建并附带 SHA256 校验和。
修复
程序在部分用户环境里直接启动不了
包内使用的是扁平导入(from utils.thmt import ...、from com import *),入口点却用 sys.path.append() 把包目录追加到搜索路径末尾 —— 而 append 的优先级低于 site-packages。因此用户环境里只要装了同名的第三方包,程序会在启动瞬间崩溃:
ModuleNotFoundError: No module named 'utils.thmt'
PyPI 上确实存在一个叫 utils 的包,所以这不是假想场景。已改为 sys.path.insert(0, ...)。
Python 3.12+ 上「检查项目导入」完全不可用
utils/cip.py 引用了 ast.Str —— 该类已在 Python 3.12 中移除,调用即抛 AttributeError。程序打包工具里的「检查导入」在 3.12 / 3.13 / 3.14 上必然失败。已改为优先使用 ast.Constant。
查询面板的默认查询模式从未生效
logic/package_manager.py 中把配置对象与枚举做了比较(self.__parent.config == QMode.NotSPCF),恒为 False,导致默认分支永远走不到。
窗口最大化状态判断写错
logic/cloud_function.py 两处写成了 if self.isMinimized() or self.isMinimized():,第二个应为 isMaximized()。结果是窗口最大化时仍会把尺寸写进配置,下次还原出来的大小不对。
拖放文件后不会滚动到底部
com/widgets.py 用的是 verticalScrollBar().maximumHeight()(控件高度)而非 maximum()(滚动范围)。
其他
utils/pyi.py:默认参数里的os.getcwd()只在导入时求值一次,进程后续切换工作目录不会更新;utils/pyi.py:生成文件的路径拼写VERSOIN_INFO→VERSION_INFO;utils/cip.py:改用chardet顶层导出的UniversalDetector,消除弃用警告。
新增
- CI:Python 3.9 ~ 3.14 矩阵跑静态检查与测试,另有 Windows exe 构建任务(构建完会真的启动一次做冒烟测试);
- 自动发布:推送
main自动发布开发版;打 tag 即发布正式版(本页即由此流程产出); - 依赖自动更新:Dependabot 每周检查,patch 级在 CI 通过后自动合并;
- 新增
tests/(含专门锁住上述启动崩溃问题的回归测试)、ruff.toml、packaging/(打包配置与校验工具)。
产物
| 文件 | 说明 |
|---|---|
Awespykit.exe |
Windows 单文件可执行程序,双击即可运行,无需安装 Python |
Awespykit.exe.sha256 |
exe 的 SHA256 校验和 |
awespykit-2.1.1-py3-none-any.whl |
Python 分发包(pip install 用) |
awespykit-2.1.1.tar.gz |
源码分发包 |
python-dist.sha256 |
两个 Python 分发包的 SHA256 校验和 |
校验下载文件是否完整(PowerShell):
Get-FileHash .\Awespykit.exe -Algorithm SHA256也可以直接用 pip install Awespykit -U。
开发版(自动构建,滚动更新)
这是从 main 分支最新代码自动构建的开发版,每有新提交就滚动覆盖。dev-latest 这个标签是固定的,所以下面两个下载地址永远指向最新一版。
当前版本:2.3.1(版本号由 git 提交历史推导)
对应提交:5ff0cd9
开发版只保证「能构建、能启动」,功能正确性请以正式发版为准。
需要稳定版本请到 Releases 页面找带版本号的正式 release。
| 文件 | 说明 |
|---|---|
Awespykit.exe |
Windows 单文件可执行程序,双击即可运行,无需安装 Python |
Awespykit.exe.sha256 |
exe 的 SHA256 校验和 |
awespykit-*.whl |
Python 分发包(pip install 用) |
awespykit-*.tar.gz |
源码分发包 |
python-dist.sha256 |
两个 Python 分发包的 SHA256 校验和 |
校验下载文件是否完整(PowerShell):
Get-FileHash .\Awespykit.exe -Algorithm SHA256也可以直接 pip install Awespykit -U,或 pip install 上面那个 whl 文件。
固定下载地址:https://github.com/laincat/AwesomePyKit/releases/download/dev-latest/Awespykit.exe