Python 代码调试工具 pylane 如何使用?

赶在回家前发个帖,推荐下我们组的 python 代码 debug 工具,希望赚波 star。

项目在这里 pylane

简单原理是:通过 gdb trace python 进程,然后在该进程的 python vm 中动态地注入一段 python 代码, 从而对一个运行中的 python 进程执行一段任意的逻辑。

这个是我们组日常线上 debug 工具的一部分核心代码,跟用 ipython 一样简单直观。

求各位大佬轻拍


Python 代码调试工具 pylane 如何使用?

18 回复

这里也有一篇我们日常 debug 的经验总结 https://mp.weixin.qq.com/s/Mlhrp2E390EMD0ZfSaNFKw


pylane 是一个用于 Python 的交互式进程内调试和诊断工具,它允许你像使用 IPython 一样,在运行时注入代码到一个正在运行的 Python 进程中。这比传统的 pdb 调试在某些场景下更灵活。

核心使用方法如下:

  1. 安装pip install pylane

  2. 启动你的目标 Python 程序。假设你的脚本是 my_script.py

    python my_script.py
    

    记下它的进程 ID (PID)。你可以用 ps aux | grep my_script.pypgrep -f my_script.py 来查找。

  3. 在另一个终端中,使用 pylane 连接到该进程

    python -m pylane <PID>
    

    例如,如果 PID 是 12345,就运行 python -m pylane 12345

  4. 进入交互式调试环境。连接成功后,你会看到一个类似 IPython 的提示符。在这里,你可以执行任何 Python 代码,并且这些代码将在目标进程的上下文和命名空间中运行。这意味着你可以直接访问和修改目标程序中的变量、函数和对象。

一个简单的代码示例演示其威力:

假设 my_script.py 内容如下:

# my_script.py
import time

counter = 0

def some_work():
    global counter
    while True:
        counter += 1
        print(f"Working... count: {counter}")
        time.sleep(5)

if __name__ == "__main__":
    some_work()

运行它:python my_script.py。假设其 PID 为 12345。

在另一个终端连接:python -m pylane 12345

在 pylane 的交互提示符中,你可以进行如下操作:

# 查看目标进程中已有的变量
In [1]: counter
Out[1]: 17 # 可能已经是某个值了

# 直接修改变量
In [2]: counter = 100

# 调用目标进程中的函数 (注意:这里会阻塞,因为 some_work 是死循环)
# 更常见的做法是检查状态或修改配置变量

# 导入模块并执行更复杂的诊断
In [3]: import threading
In [4]: for thread in threading.enumerate():
   ...:     print(thread.name, thread.is_alive())

关键点:

  • 侵入性:你的代码会直接影响目标进程,操作错误可能导致程序崩溃。
  • 适用场景:非常适合诊断线上问题、分析内存状态、动态修改配置,或者当程序卡住时查看内部状态,而无需重启或预先添加大量调试日志。
  • 与 pdb 的区别:pdb 需要你在代码中预先设置断点或通过信号触发,是“计划内”的调试。pylane 是“无侵入”的,可以随时附加到任何正在运行的 Python 进程进行“外科手术式”检查。

一句话总结:把它当作一个能直接“附体”到运行中进程的超级版 IPython 来用就行。

前排收藏

伪前排收藏

学习下

对,看起来确实很像,不过 py3、自动补全等我们做的还是要稍微好些。更重要的是。。还在持续维护。。

收藏了

大佬们吊。

好像挺牛逼的

收藏一哈

可以,微信那个文章写的很好,这个工具也很好用的样子,已经 star 了。

哇,正好需要,谢谢

牛批啊。 马客住。

八客气,有用就好~

注入这个功能不错,收藏+1

线上这样 debug,感觉怪怪的。。。

emmm,并不罕见呀,保留事发现场

回到顶部