Answers:
您可以使用pdb模块,将pdb.set_trace()
其插入任何地方,它将用作断点。
>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)
要继续执行,请使用c
(或cont
或continue
)。
可以使用pdb执行任意Python表达式。例如,如果发现错误,则可以更正代码,然后键入一个类型表达式以在运行的代码中产生相同的效果。
ipdb是用于IPython的pdb版本。它允许将pdb与所有IPython功能一起使用,包括制表符补全。
Pydb被编写为Pdb的增强版本。有好处吗?
myserver.com/pdb
只需在调试模式下添加一个视图即可import pdb; pdb.set_trace()
。如果您使用的是具有交互式调试器的Flask / Werkzeug,那么您也可以拥有的视图assert False
。
http://pypi.python.org/pypi/pudb,一个基于控制台的全屏Python调试器。
它的目标是以更加轻巧和键盘友好的软件包提供基于GUI的现代调试器的所有优点。PuDB允许您在终端中在编写和测试代码的地方调试代码。如果您使用过出色的(但时至今日仍是古老的)基于DOS的Turbo Pascal或C工具,那么PuDB的UI可能看起来很熟悉。
非常适合调试独立脚本,只需运行
python -m pudb.run my-script.py
pip install pudb
如果使用的是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
记录中
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
print
陈述
debug_print
功能而不是打印功能来轻松禁用pprint
模块对于复杂的结构是无价的Winpdb非常好,与它的名称相反,它是完全跨平台的。
它有一个非常好的提示,基于和 GUI调试器,并支持远程调试。
在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一起使用。因为我知道您会问,所以它可以完成我期望图形调试器完成的所有工作:)
我使用pdb
from nose.tools
来调试单元测试和普通代码。
最后,F7
映射将打印回溯(类似于异常冒泡到堆栈顶部时所得到的那种)。我发现它确实有用了很多次。
为类定义有用的repr()方法(以便您可以看到对象是什么),并使用repr()或“%r”%(...)或“ ... {0!r} ..” .. format (...)在您的调试消息/日志中,恕我直言,这是高效调试的关键。
另外,其他答案中提到的调试器将使用repr()方法。
如果您想要一种很好的图形方式以一种可读的方式打印您的调用堆栈,请查看此实用程序: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.ProfilerMiddleware
到MIDDLEWARE_CLASSES
,然后添加?profile
到请求URL的末尾以激活分析器。