Skip to content

Releases: laincat/AwesomePyKit

Awespykit 2.3.1

Choose a tag to compare

@laincat laincat released this 28 Sep 02:20

界面文案调整:关于页面现在区分原作者与维护者。

原作者:  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

Choose a tag to compare

@laincat laincat released this 28 Sep 02:09

本次发布包含两项实质改动,其中下载体积减少约三分之一。

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

Choose a tag to compare

@laincat laincat released this 26 Sep 13:19

本次修复两个影响日常使用的问题。

修复:点右上角关闭按钮会崩溃

现象:点任意子窗口(包管理器、程序打包工具、镜像源设置、安装包下载器、云函数打包)右上角的 X,程序直接消失,没有任何提示。有时又不崩。

原因是两处叠加:

  1. 这些窗口在关闭时会调用一个函数来保存配置,但该函数名没有被导入。这行代码一执行就抛 NameError,而它运行在 Qt 的 C++ 事件处理里,Python 异常无法向上传播,只能直接崩掉进程 —— 所以看不到任何报错信息。

  2. 判断「是否有任务在运行」的逻辑只检查线程列表的长度,不检查线程是否真的还在运行。已经结束、但尚未被清理定时器移除的线程会被误判成运行中,于是关闭时试图弹出「任务正在进行」的对话框。在关闭流程里弹模态对话框会让 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

Choose a tag to compare

@laincat laincat released this 26 Sep 10:13

本次为重构版本:界面布局与操作方式保持不变,已有的配置文件可以继续使用。主要内容是让代码结构恢复可维护性,并修掉一批会在使用中真实碰到的问题。

重构:包内导入规范化

原先包内把 com / logic / settings / ui / utils 当作顶层模块导入(例如 from utils.thmt import ...),共 44 处。这种写法有三个实际后果:

  1. 用户环境里只要装了同名的第三方包,程序会直接启动失败。PyPI 上确实存在一个叫 utils 的包,报错为 ModuleNotFoundError: No module named 'utils.thmt';
  2. 必须先手工把包目录塞进 sys.path 才能工作,换个启动方式就可能失败;
  3. 子包之间无法表达依赖关系,改动时容易踩坑。

现已全部改为规范的包内导入。

修复

含相对导入的文件,「检查导入」功能完全失效

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

Choose a tag to compare

@laincat laincat released this 26 Sep 09:07

本次发布主要是修复若干缺陷,并补齐自动化(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。

开发版(自动构建,滚动更新)

Choose a tag to compare

@github-actions github-actions released this 26 Sep 08:43

这是从 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