在Java/ c#中,您可以很容易地逐级检查代码以跟踪可能出错的地方,而IDE使这个过程对用户非常友好。

你能以类似的方式跟踪python代码吗?


当前回答

ipdb (IPython调试器)

ipdb在pdb中添加了IPython功能,提供了以下巨大的改进:

选项卡完成 显示更多的上下文行 语法高亮显示

就像pdg一样,如果与GDB相比,ipdb还远远不够完美和完全初级,但它已经比pdb有了巨大的改进。

用法类似于pdb,只需安装它:

python3 -m pip install --user ipdb

然后添加到你想要进行步进调试的行:

__import__('ipdb').set_trace(context=21)

你可能想从你的编辑器中添加一个快捷方式,例如,对于Vim snipmate我有:

snippet ipd
    __import__('ipdb').set_trace(context=21)

所以我可以输入ipd<tab>,它扩展到断点。然后使用dd很容易删除它,因为所有内容都包含在一行中。

context=21增加上下文行数,如调试时如何使ipdb显示更多的上下文行所述?

或者,你也可以从一开始调试程序:

ipdb3 main.py

但你通常不想这样做,因为:

在Python读取这些行时,你必须遍历所有函数和类的定义 我不知道如何在不入侵ipdb的情况下设置上下文大小。补丁允许:https://github.com/gotcha/ipdb/pull/155

或者,就像在raw pdb 3.2+中一样,你可以从命令行设置一些断点:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

尽管-c c因为某些原因被破坏了:https://github.com/gotcha/ipdb/issues/156

如何调试从命令行使用python -m运行的python模块?因为Python 3.7可以用:

python -m pdb -m my_module

与GDB相比,pdb和ipdb的特性严重缺失:

持久化命令历史跨会话:保存命令历史在pdb中

Ipdb具体烦恼:

多线程不能很好地工作,如果你不hack一些设置… ipdb,多线程和自动重载程序导致ProgrammingError https://github.com/gotcha/ipdb/issues/51

在Ubuntu 16.04中测试,ipdb==0.11, Python 3.5.2。

其他回答

使用Python交互式调试器'pdb'

第一步是使Python解释器进入调试模式。

A.从命令行

最直接的方式,从命令行运行,python解释器

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B.解释器内部

在开发模块的早期版本时,并更迭代地进行实验。

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C.从你的程序内部

对于大项目和长时间运行的模块,可以从程序内部使用启动调试 导入PDB和set_trace() 像这样:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

逐步调试进入更内部

Execute the next statement… with “n” (next) Repeating the last debugging command… with ENTER Quitting it all… with “q” (quit) Printing the value of variables… with “p” (print) a) p a Turning off the (Pdb) prompt… with “c” (continue) Seeing where you are… with “l” (list) Stepping into subroutines… with “s” (step into) Continuing… but just to the end of the current subroutine… with “r” (return) Assign a new value a) !b = "B" Set a breakpoint a) break linenumber b) break functionname c) break filename:linenumber Temporary breakpoint a) tbreak linenumber Conditional breakpoint a) break linenumber, condition

注意:**所有这些命令都应该在**pdb中执行

更深入的了解请参考:-

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/

在python中有一个叫做'pdb'的模块。在python脚本的顶部

import pdb
pdb.set_trace()

然后进入调试模式。您可以使用's'步进,'n'跟随下一行,类似于使用'gdb'调试器。

ipdb (IPython调试器)

ipdb在pdb中添加了IPython功能,提供了以下巨大的改进:

选项卡完成 显示更多的上下文行 语法高亮显示

就像pdg一样,如果与GDB相比,ipdb还远远不够完美和完全初级,但它已经比pdb有了巨大的改进。

用法类似于pdb,只需安装它:

python3 -m pip install --user ipdb

然后添加到你想要进行步进调试的行:

__import__('ipdb').set_trace(context=21)

你可能想从你的编辑器中添加一个快捷方式,例如,对于Vim snipmate我有:

snippet ipd
    __import__('ipdb').set_trace(context=21)

所以我可以输入ipd<tab>,它扩展到断点。然后使用dd很容易删除它,因为所有内容都包含在一行中。

context=21增加上下文行数,如调试时如何使ipdb显示更多的上下文行所述?

或者,你也可以从一开始调试程序:

ipdb3 main.py

但你通常不想这样做,因为:

在Python读取这些行时,你必须遍历所有函数和类的定义 我不知道如何在不入侵ipdb的情况下设置上下文大小。补丁允许:https://github.com/gotcha/ipdb/pull/155

或者,就像在raw pdb 3.2+中一样,你可以从命令行设置一些断点:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

尽管-c c因为某些原因被破坏了:https://github.com/gotcha/ipdb/issues/156

如何调试从命令行使用python -m运行的python模块?因为Python 3.7可以用:

python -m pdb -m my_module

与GDB相比,pdb和ipdb的特性严重缺失:

持久化命令历史跨会话:保存命令历史在pdb中

Ipdb具体烦恼:

多线程不能很好地工作,如果你不hack一些设置… ipdb,多线程和自动重载程序导致ProgrammingError https://github.com/gotcha/ipdb/issues/51

在Ubuntu 16.04中测试,ipdb==0.11, Python 3.5.2。

从Python 3.7开始,你可以使用breakpoint()内置函数进入调试器:

foo()
breakpoint()  # drop into the debugger at this point
bar()

默认情况下,breakpoint()将导入pdb并调用pdb.set_trace()。但是,你可以通过sys.breakpointhook()和使用环境变量PYTHONBREAKPOINT来控制调试行为。

有关更多信息,请参阅PEP 553。

https://wiki.python.org/moin/PythonDebuggingTools

Pudb是PDB的一个很好的替代品