[求助] 如何让 Python 函数在运行的时候可被中断,类似单步调试 - V2EX
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 月 3 日 9656 次点击
    这是一个创建于 4526 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题。但不是为了 debug。

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

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

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

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

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

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

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

    一次拥有,终生不忘
    ruoyu0088
        12
    ruoyu0088  
       2013 年 11 月 4 日
    @Hualin,是直接修改演示程序的源代码,在每句话之后添加保存local()的语句。我觉得你既然为了演示,N不会太大吧。
    Hualin
        13
    Hualin  
    OP
       2013 年 11 月 4 日
    @ruoyu0088 嗯 我会把这几个实现方案都试试,说得多啥都不写没用。谢谢。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5833 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 63ms UTC 06:18 PVG 14:18 LAX 23:18 JFK 02:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86