开篇:调试也能这么爽?
你是不是和我一样,天天跟 print() 打交道,一行行地往代码里塞调试信息?有时候加完又删,删完又忘,简直要疯掉!要是能像 Bash 的 set -x 那样,一键打开“观察模式”,刷出所有执行流和变量变化就好了……好消息来了,PySnooper 完全满足你这种“懒”需求!
PySnooper 是个啥东东?
- • “极简的调试器”:不用重装 IDE、不开多余端口,随用随走
- • 像 set -x,但更花哨:记录每行执行时间、前后变量变化
- • 就是给你要调试的函数,贴个装饰器,剩下交给它
它解决了哪些痛点?
- 1. 不用 再写一堆 print(f”…”)。
- 2. 调试信息全,包含执行时间戳、行号、变量新旧值。
- 3. 线下/生产环境里也能用,不担心影响主流程。
- 4. 快速定位漏跑分支、变量被意外修改的问题。
安装、使用超简单
安装只需一行:
pip install pysnooper
(如果你玩 Conda、Arch、Fedora 也都支持,见下表)
表:多种安装方式对比
|
平台 |
安装命令 |
备注 |
|
Pip |
pip install pysnooper |
最主流 |
|
Conda |
conda install -c conda-forge pysnooper |
喜爱用 Anaconda 的首选 |
|
Arch Linux |
yay -S python-pysnooper |
Arch 用户福利 |
|
Fedora |
dnf install python3-pysnooper |
Fedora 上直接装 |
快速上手
- 1. 装饰器import pysnooper
@pysnooper.snoop()
def to_bits(n):
if n:
bits = []
while n:
n, r = divmod(n, 2)
bits.insert(0, r)
return bits
else:
return [0]to_bits(6)立刻在 stderr(或指定文件)看到每行日志和变量变动。
- 2. 上下文管理器import pysnooper, random
def foo():
data = [random.randint(1, 1000) for _ in range(10)]
with pysnooper.snoop():
lo = min(data)
hi = max(data)
mid = (lo + hi) / 2
print(lo, mid, hi)foo()只追踪 with 代码块。
功能速览
|
功能 |
描述 |
示例用法 |
|
输出定向 |
将日志写到指定文件或自定义流 |
snoop('log.txt') |
|
监视任意表达式 |
不仅限本地变量,连 foo.bar、self.x['y'] 都能看 |
snoop(watch=('foo.bar',)) |
|
调试深度 |
追踪子函数调用 |
snoop(depth=2) |
|
时间戳 & 耗时 |
显示每行执行的时间戳和累计/单行耗时 |
—— |
|
无侵入性 |
不改源逻辑,只加一行装饰器或一个 with 块 |
—— |
优缺点一览
|
优点 |
缺点 |
|
零学习成本,秒上手 |
日志较多,可能要过滤关键信息 |
|
不改业务逻辑,随加随删 |
只适合调试,不能做性能分析 |
|
支持各种环境(本地、生产、CI……) |
对超大函数可能输出过长 |
|
灵活定向:stderr / 文件 / 自定义流 |
没有可视化界面,全靠文本阅读 |
总结
总的来说,PySnooper 就像给你的函数装了“透视眼镜”,能实时看见行号、时间戳和变量新旧值,彻底摆脱一行行 print() 的折腾。它不够花哨(列如没有 GUI),也不是性能剖析利器,但用它来“穷追猛打”排查逻辑问题,绝对是省时省心的利器。下次写 Python,想要“即刻回显”“零成本调试”,就试试加个 @pysnooper.snoop() 吧!
项目地址:https://github.com/cool-RR/PySnooper


