JZX 轻语

挖掘时光的细节

[Python导入系统] 如何调试importlib_bootstrap模块

书接上回,我们已经知道如何调试大部分的冻结模块,然而,由于importlib的_bootstrap属性是通过导入_frozen_importlib这个不同名的冻结模块实现的,前文的方法仍无法做到对importlib._bootstrap的源码级调试,需要进一步研究如何通过patch的方式,诱拐解释器载入源码实现调试。 importlib._bootstrap的导入实现 上文说到,im...

[Python进阶] 如何解冻和调试冻结模块(Frozen Modules)

使其在PyCharm等IDE上支持堆栈信息显示、断点以及单步调试。

背景 在Pycharm等IDE调试Python程序时,我们有时候会注意到调用栈中,有部分栈帧显示frame not available,如果使用inspect.stack输出栈信息,可以看到这些栈帧处在冻结模块(带有frozen字样的模块名)里,而pdb、pydevd等调试器往往不能进入这些冻结模块上进行调试,不方便我们研究内部的运行机制。本文以此为出发点,尝试通过多种手段,使得解释器能够...

[Python导入系统] 当`import os.path`时,导入系统发生了什么?

`os.path`并非是`os`包的一个子模块,而是`posixpath`或`ntpath`模块的别名。

[Python导入系统] 访问子模块报错`AttributeError`的诡异问题解决

不要随意删除`sys.modules`中的模块,否则可能导致子模块无法访问!

ST表的Python实现模板(支持泛型类型检查)

参照OIWiki对于ST表的C++实现,实现了一套Python版本的ST表,支持Python类型检查的泛型(Generic)推导功能。ST表是一种用于解决区间查询问题的数据结构,其主要用途是在O(1)时间内查询区间内的最值等可重复贡献的问题。需要使用的时候,直接复制下面的代码到Python文件中即可。 import math from typing import Callable, Ge...

[Qt/PyQt] PyQt5全层次构建与调试

在调试PyQt程序中,对于一些更底层所诱发的问题,有时候PyCharm无法捕捉到此类问题,通常需要在C/C++层面的Qt或sip进行调试。 而对于RiverBank的PyQt5,由于其并没有提供Debug版本的库,因此无法通过windbg等调试器对更底层的Qt或sip进行调试。本文以此为出发点,以Qt 5.15.2 64位为例,介绍如何手动构建PyQt5的各个层次,以及如何在VSCode中使...

RustDesk自建服务器札记[简易版]

RustDesk是一款开源的远程桌面软件,支持Windows、Linux、MacOS等多个平台。它的特点是简单易用,无需配置,只需下载安装即可使用。此外,RustDesk支持自建服务器,可利用自己的服务器实现高质量的画质传输,而无需付费购买主流远程桌面软件的增值服务。本文记录了如何在腾讯云轻量应用服务器搭建RustDesk服务器的简易步骤。 前提 腾讯云服务器一台,系统为CentOS 7...

[Ubuntu] Grub引导修复札记

之前入手的的致态硬盘出现了0e问题,里面所安装的系统bug不断,担忧数据会进一步丢失。于是换上了三星的970 Evo Plus并全盘安装了最新的Ubuntu 24.04。但由于先前Windows系统的引导分区处在致态硬盘上,导致换盘后无法进入Windows系统。通过PE修复了Windows的引导后,Ubuntu的引导也出现了问题,导致grub引导菜单无法正常显示。经过一番折腾,终于让菜单项显...

Ubuntu 24.04开机黑屏的一种可能解决方法

时隔一年后重新入手了Ubuntu,安装了最新的Ubuntu 24.04后,在某次锁屏后,发现再也无法正常输入密码(输入了密码前三个字符后,键盘无法继续输入剩下的字符),也没办法在GUI中重启系统,只能通过tty通过reboot命令重启。重启后,发现再也进不去系统,一直黑屏,且由于之前对Windows的引导进行了修复,导致grub的normal模式的菜单界面也进不去。问题比较棘手,需要进行一系...

[LeetCode每日一题] 2952需要添加的银币的最小数量

题目 题目链接 给你一个下标从 0 开始的整数数组 coins,表示可用的硬币的面值,以及一个整数 target 。 如果存在某个 coins 的子序列总和为 x,那么整数 x 就是一个 可取得的金额 。 返回需要添加到数组中的 任意面值 硬币的 最小数量 ,使范围 [1, target] 内的每个整数都属于 可取得的金额 。 数组的 子序列 是通过删除原始数组的一些(可能不删除)...