如何单步执行 Python 代码以帮助调试问题?

新手上路,请多包涵

在 Java/C# 中,您可以轻松地逐步执行代码以跟踪可能出现的问题,而 IDE 使此过程非常用户友好。

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

原文由 Blankman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 334
2 个回答

是的!有一个名为 pdb 的 Python 调试器 — 就是为了这样做!

您可以使用 pdb myscript.pypython -m pdb myscript.py 通过 pdb 启动 Python 程序。

然后您可以发出一些命令,这些命令记录在 pdb 页面上。

要记住的一些有用的是:

  • b : 设置断点
  • c : 继续调试直到遇到断点
  • s :单步执行代码
  • n :转到下一行代码
  • l : 列出当前文件的源代码(默认:11 行,包括正在执行的行)
  • u :向上导航堆栈框架
  • d :向下导航堆栈框架
  • p : 打印当前上下文中表达式的值

如果您不想使用命令行调试器,一些 IDE,如 PydevWing IDEPyCharm 有一个 GUI 调试器。 Wing 和 PyCharm 是商业产品,但 Wing 有免费的“个人”版,而 PyCharm 有免费的社区版。

原文由 user193476 发布,翻译遵循 CC BY-SA 4.0 许可协议

通过使用 Python Interactive Debugger ‘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. 从你的程序中

对于大型项目和长时间运行的模块,可以使用 import pdbset_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()

逐步调试以进入更多内部

  1. 执行下一条语句……使用 “n” (下一个)

  2. 重复上一个调试命令…使用 ENTER

  3. 退出一切……用 “q” (退出)

  4. 打印变量的值……用“p”(打印)

    一)

  5. 关闭 (Pdb) 提示符……使用 “c” (继续)

  6. 查看您的位置……使用 “l” (列表)

  7. 进入子程序……用 “s” (进入)

  8. 继续……但只是到当前子程序的结尾……用 “r” (返回)

  9. 分配一个新值

    一) !乙=“乙”

  10. 设置断点

    a) 断行号

    b) 中断函数名

    c) 中断文件名:行号

  11. 临时断点

    a) tbreak 行号

  12. 条件断点

    a) 断行号、条件

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

如需深入了解,请参阅:-

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

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

原文由 akD 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题