Python 调试技巧[关闭]

2024-12-06 08:39:00
admin
原创
96
摘要:问题描述:调试 Python 的最佳技巧是什么?请不要只列出特定的调试器而不说明它实际上能做什么。有关的有什么好方法可以让我的 Python 代码第一次运行? ——讨论如何尽量减少错误解决方案 1:局部数据库您可以使用 pdb 模块,插入pdb.set_trace()任何位置,它将发挥断点的作用。>&g...

问题描述:

调试 Python 的最佳技巧是什么?

请不要只列出特定的调试器而不说明它实际上能做什么。

有关的

  • 有什么好方法可以让我的 Python 代码第一次运行? ——讨论如何尽量减少错误


解决方案 1:

局部数据库

您可以使用 pdb 模块,插入pdb.set_trace()任何位置,它将发挥断点的作用。

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

要继续执行,请使用c(或contcontinue)。

使用 pdb 可以执行任意 Python 表达式。例如,如果你发现错误,你可以更正代码,然后键入类型表达式以在运行的代码中产生相同的效果

ipdb 是IPython的一个 pdb 版本。它允许使用 pdb 的所有 IPython 功能,包括制表符补全。

还可以将pdb 设置为在未捕获的异常时自动运行。

Pydb被编写为 Pdb 的增强版本。优点是什么?

解决方案 2:

http://pypi.python.org/pypi/pudb,一个全屏、基于控制台的 Python 调试器。

它的目标是在一个更轻量级、键盘友好的软件包中提供现代基于 GUI 的调试器的所有优点。PuDB 允许您在编写和测试代码的地方(在终端中)调试代码。如果您使用过基于 DOS 的优秀(但如今已过时)Turbo Pascal 或 C 工具,PuDB 的 UI 可能看起来很熟悉。

pudb 截图

非常适合调试独立脚本,只需运行

python -m pudb.run my-script.py

解决方案 3:

如果您使用 pdb,则可以为快捷方式定义别名。我使用这些:

# Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d

解决方案 4:

日志记录

Python 已经有一个出色的内置日志模块。您可能希望在此处使用日志模板。

日志模块允许您指定重要性级别;在调试期间,您可以记录所有内容,而在正常运行期间,您可能只记录关键内容。您可以关闭或打开这些内容。

大多数人只是使用基本的打印语句进行调试,然后删除打印语句。最好保留它们,但禁用它们;然后,当您遇到另一个错误时,您可以重新启用所有内容并查看日志。

这可能是调试需要快速执行操作的程序的最佳方法,例如需要在网络连接另一端超时并断开之前做出响应的网络程序。您可能没有太多时间单步调试程序;但您可以让代码运行并记录所有内容,然后仔细查看日志并找出真正发生的事情。

编辑:模板的原始 URL 是:http ://aymanh.com/python-debugging-techniques

该页面丢失,因此我用对 archive.org 上保存的快照的引用替换了它:http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques

以防它再次消失,以下是我提到的模板。这是从博客中获取的代码;我没有写它。

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __name__ == '__main__':
  main()

以下是他对如何使用上述内容的解释。同样,这并非我的功劳:


默认情况下,日志记录模块会打印严重、错误和警告消息。要更改此设置以打印所有级别,请使用:

$ ./your-program.py --logging=debug

要将日志消息发送到名为 debug.log 的文件,请使用:

$ ./your-program.py --logging-level=debug --logging-file=debug.log

解决方案 5:

可以打印执行了哪些 Python 行(感谢 Geo!)。它有许多应用,例如,您可以修改它以检查何时调用特定函数,或者添加类似 ## 的内容使其仅跟踪特定行。

code.interact 带你进入交互式控制台

import code; code.interact(local=locals())

如果您希望能够轻松访问控制台历史记录,请查看:“我可以拥有像在 shell 中一样的历史记录机制吗? ”(必须向下查找)。

可以为解释器启用自动完成功能。

解决方案 6:

ipdb 与 pdb 类似,但具有 ipython 的强大功能。

解决方案 7:

print语句

  • 有些人建议debug_print使用功能来代替打印,以便轻松禁用

  • pprint模块对于复杂结构来说非常有用

解决方案 8:

调试脚本的明显方法

python -m pdb script.py
  • 当脚本引发异常时很有用

  • 当使用 virtualenv 且 pdb 命令未与 venvs python 版本一起运行时很有用。

如果你不知道这个脚本的具体位置

python -m pdb ``which <python-script-name>``

解决方案 9:

軟件

PyDev有一个相当不错的交互式调试器。它有监视表达式、悬停求值、线程和堆栈列表以及(几乎)所有你期望从现代可视化调试器获得的常用功能。你甚至可以附加到正在运行的进程并进行远程调试。

不过,像其他可视化调试器一样,我发现它主要对简单问题有用,或者在我尝试了其他所有方法后对非常复杂的问题有用。我仍然用日志记录来完成大部分繁重的工作。

解决方案 10:

如果您熟悉 Visual Studio,那么Visual Studio 的 Python 工具就是您所需要的。

在此处输入图片描述

解决方案 11:

Winpdb非常好,并且与它的名字相反,它是完全跨平台的。

它有一个非常好的基于提示的GUI调试器,并支持远程调试。

解决方案 12:

在 Vim 中,我有以下三个绑定:

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2是一个远程 Python 调试器,可以与 WinPDB(一个可靠的图形调试器)一起使用。因为我知道你会问,它可以完成我期望图形调试器做的所有事情 :)

我使用pdbfromnose.tools以便我可以调试单元测试以及正常代码。

最后,F7映射将打印回溯(类似于异常冒泡到堆栈顶部时获得的回溯)。我发现它确实很有用,不止一次。

解决方案 13:

为您的类定义有用的repr () 方法(以便您可以看到对象是什么)并在您的调试消息/日志中使用 repr() 或 "%r" % (...) 或 "...{0!r}..".format(...) 在我看来是高效调试的关键。

此外,其他答案中提到的调试器将使用repr () 方法。

解决方案 14:

从正在运行的 Python 应用程序获取堆栈跟踪

这里有几个技巧。这些包括

  • 通过发送信号进入解释器/打印堆栈跟踪

  • 从未准备好的 Python 进程中获取堆栈跟踪

  • 使用标志运行解释器,使其有利于调试

解决方案 15:

如果您不喜欢在调试器上花费时间(并且不喜欢pdb命令行界面的可用性差),您可以转储执行跟踪并在以后进行分析。例如:

python -m trace -t setup.py install > execution.log

这会将所有源代码setup.py install执行行转储至execution.log

为了更容易定制跟踪输出和编写自己的跟踪器,我将一些代码片段放在xtrace模块(公共域)中。

解决方案 16:

如果可能的话,我使用M-x pdbemacs 进行源代码级调试。

解决方案 17:

Udacity 上有一个由 Andreas Zeller 开设的完整在线课程“软件调试”,其中包含有关调试的提示:

课程概要

在本课程中,你将学习如何系统地调试程序,如何自动化调试过程以及如何用 Python 构建几个自动化调试工具。

为什么要参加这门课程?

在本课程结束时,您将对系统调试有扎实的了解,知道如何自动化调试,并用 Python 构建了几个功能调试工具。

先决条件和要求

需要具备 Udacity CS101 或更高级别的编程和 Python 基础知识。对面向对象编程的基本了解将有所帮助。

强烈推荐。

解决方案 18:

如果你想要一种图形化的方式,以可读的方式打印你的调用堆栈,请查看此实用程序:https ://github.com/joerick/pyinstrument

从命令行运行:

python -m pyinstrument myscript.py [args...]

作为模块运行:

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# code you want to profile

profiler.stop()
print(profiler.output_text(unicode=True, color=True))

使用django运行:

只需添加pyinstrument.middleware.ProfilerMiddlewareMIDDLEWARE_CLASSES,然后添加?profile到请求 URL 的末尾即可激活分析器。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1008  
  在项目管理中,变更是一个不可避免的现象。无论是客户需求的调整、市场环境的变化,还是技术方案的更新,都可能引发项目的变更。如果处理不当,这些变更可能会导致项目延期、成本超支,甚至项目失败。因此,如何有效地应对项目变更,成为项目管理中的核心挑战之一。IPD(集成产品开发)作为一种高效的项目管理方法,其流程图不仅能够帮助团队...
IPD流程中的charter   0  
  IPD(Integrated Product Development,集成产品开发)是华为在长期实践中总结出的一套高效产品开发管理体系。它不仅帮助华为在全球市场中脱颖而出,也成为许多企业提升产品开发效率的参考标杆。IPD的核心在于通过跨部门协作、流程优化和资源整合,实现从需求分析到产品交付的全生命周期管理。通过实施IP...
IPD开发流程管理   0  
  华为IPD(集成产品开发)流程是一种以客户需求为导向、跨部门协同的高效项目管理方法。它通过系统化的流程设计和严格的阶段控制,确保项目从概念到交付的每个环节都能高效运作。IPD流程的核心在于打破传统职能部门的壁垒,将产品开发、市场、销售、供应链等关键环节整合到一个统一的框架中,从而实现资源的优化配置和信息的无缝流动。这种...
IPD流程中TR   0  
  在项目管理的实践中,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节。通过这一评审,项目团队不仅能够验证其数据中心设计和运营的合规性,还能提升整体管理水平。为了确保评审的顺利进行,准备一系列关键文档是必不可少的。这些文档不仅是评审的依据,也是项目团队与评审专家...
华为IPD是什么   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用