V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Hualin
V2EX  ›  Python

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

  •  
  •   Hualin · 2013-11-03 01:57:18 +08:00 · 9119 次点击
    这是一个创建于 4023 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题。但不是为了 debug。

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

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

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

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

    Open Source:https://github.com/pgbovine/OnlinePythonTutor/
    tioover
        8
    tioover  
       2013-11-03 12:49:29 +08:00
    排序算法要可视化呈现,那么做一个类似List 的结构,在这个class 里面做手脚,比如说Insert 就是插入并且更新画面并且暂停。
    Hualin
        9
    Hualin  
    OP
       2013-11-03 21:37:19 +08:00
    @9hills 他们用的技术是 bdb,看起来就是个现成的实现,可以结合 local 打印出来中间结果的log。正在看
    谢谢
    Hualin
        10
    Hualin  
    OP
       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
        11
    mengzhuo  
       2013-11-04 09:59:26 +08:00
    import ipdb;ipdb.set_trace()

    一次拥有,终生不忘
    ruoyu0088
        12
    ruoyu0088  
       2013-11-04 16:04:12 +08:00
    @Hualin,是直接修改演示程序的源代码,在每句话之后添加保存local()的语句。我觉得你既然为了演示,N不会太大吧。
    Hualin
        13
    Hualin  
    OP
       2013-11-04 20:50:48 +08:00
    @ruoyu0088 嗯 我会把这几个实现方案都试试,说得多啥都不写没用。谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1724 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.