[求助] 如何让 Python 函数在运行的时候可被中断,类似单步调试

2013-11-03 01:57:18 +08:00
 Hualin
如题。但不是为了 debug。

作业要求做一个各种排序算法的图形化展现。我的设计是有一个 mode,用户可以追踪函数每一步的执行情况,并和其可视化有一个同步展现。那么,我可以选择单步运行,排序算法的可视化视图会一步一步做排序操作,其对应的代码视图也会一步一步的显示当前所执行的是哪一步命令,我还可以查看中间变量的变化。

所以这个程序需要我写的排序函数是一个可中断的。那么在每一步命令之前设一个等 图形化界面 按钮消息的 flag,然后?

Python 里面有没有比较现成的解决方案,除了 pdb,不是debug,但最后效果类似 debug。我只是不想重新发明轮子。(写排序算法不就是发明轮子么,呵呵呵,这个课程设计其实蛮无聊的,貌似全年级只有我一个人用 python)
9150 次点击
所在节点    Python
13 条回复
fqrouter2
2013-11-03 02:25:15 +08:00
stackless python
greenlet
pypy
Hualin
2013-11-03 02:33:35 +08:00
@fqrouter2 why Stackless? I don't need that.
unionx
2013-11-03 02:39:21 +08:00
systemtap or dtrace
bombless
2013-11-03 06:30:08 +08:00
有一种做法是做语法分析,在需要的地方插入桩,然后运行这个结果来得到近似的效果
ruoyu0088
2013-11-03 06:48:19 +08:00
排序函数是你自己写的吧,你在每条语句之后插入获取所有局部变量的locals()调用,并保存这条语句的行号和文本,当然这个过程可以用一个程序自动化。

执行一遍程序之后,你就有单步执行的所有信息了,然后对这些信息可视化就可以了。不需要真正地单步执行程序。
fay
2013-11-03 07:34:06 +08:00
可以配合使用yield和send、next函数,send函数的返回值可以是locals()调用的结果,即中间变量。
9hills
2013-11-03 08:36:49 +08:00
lz要的是不是这个效果:(可能需要爬墙)
http://www.pythontutor.com/

Open Source:https://github.com/pgbovine/OnlinePythonTutor/
tioover
2013-11-03 12:49:29 +08:00
排序算法要可视化呈现,那么做一个类似List 的结构,在这个class 里面做手脚,比如说Insert 就是插入并且更新画面并且暂停。
Hualin
2013-11-03 21:37:19 +08:00
@9hills 他们用的技术是 bdb,看起来就是个现成的实现,可以结合 local 打印出来中间结果的log。正在看
谢谢
Hualin
2013-11-04 08:07:04 +08:00
@ruoyu0088 请问你所说的 "自动执行"是什么意思?是不是不用每句后面都加 local()?有种方法就让它单步推出 local?

我刚看完 Online Python Tutor, 里面的实现对我的作业来说有点 overkill。我想简化一下它的后端,也就是它的 debugger (继承自 bdb)。

但是自己实现一个简易的 debugger 来记录单步信息貌似还是比较难。而且我这核心程序是排序算法,有些 N^2 的算法的单步步奏太多,如果按照 前面我提到的那个 project 的做法全部把 单步信息存到 json 里,会很没效率。我想把重要的我选择的单步信息推送到 numpy (一个 python 数学库,对大型 array 的处理很快),然后在到前端做单步可视化。
mengzhuo
2013-11-04 09:59:26 +08:00
import ipdb;ipdb.set_trace()

一次拥有,终生不忘
ruoyu0088
2013-11-04 16:04:12 +08:00
@Hualin,是直接修改演示程序的源代码,在每句话之后添加保存local()的语句。我觉得你既然为了演示,N不会太大吧。
Hualin
2013-11-04 20:50:48 +08:00
@ruoyu0088 嗯 我会把这几个实现方案都试试,说得多啥都不写没用。谢谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/87871

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX