Cas*_*ash 164 python debugging
调试Python的最佳技巧是什么?
请不要只列出一个特定的调试器,而不说它实际上可以做什么.
gho*_*g74 139
你可以使用pdb模块,在pdb.set_trace()
任何地方插入,它将作为断点.
>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)
Run Code Online (Sandbox Code Playgroud)
继续执行使用c
(或cont
或continue
).
可以使用pdb执行任意Python表达式.例如,如果发现错误,则可以更正代码,然后键入类型表达式以在运行代码中具有相同的效果
ipdb是IPython的pdb版本.它允许使用pdb和所有IPython功能,包括选项卡完成.
也可以将pdb设置为自动运行未捕获的异常.
Pydb被编写为Pdb的增强版本.好处?
mik*_*iku 78
http://pypi.python.org/pypi/pudb,一个基于控制台的全屏Python调试器.
它的目标是在更轻量级和键盘友好的包中提供现代基于GUI的调试器的所有细节.PuDB允许您在编写和测试它的位置调试代码 - 在终端中.如果您使用过基于DOS的Turbo Pascal或C工具,那么PuDB的UI可能看起来很熟悉.
很适合调试独立脚本,只需运行即可
python -m pudb.run my-script.py
Run Code Online (Sandbox Code Playgroud)
Ned*_*der 40
如果您使用的是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
Run Code Online (Sandbox Code Playgroud)
ste*_*eha 33
记录
Python已经有一个出色的内置日志记录模块.您可能希望在此处使用日志记录模板.
日志记录模块允许您指定重要性级别; 在调试期间,您可以记录所有内容,而在正常操作期间,您可能只记录关键内容.您可以关闭和打开电源.
大多数人只是使用基本的打印语句进行调试,然后删除print语句.最好留下它们,但禁用它们; 然后,当你有另一个bug时,你可以重新启用所有内容并查看你的日志.
这可能是调试需要快速执行的程序的最佳方法,例如在网络连接的另一端超时和消失之前需要响应的网络程序.您可能没有太多时间单步执行调试器; 但你可以让你的代码运行,并记录所有内容,然后查看日志并找出真正发生的事情.
编辑:模板的原始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()
Run Code Online (Sandbox Code Playgroud)
以下是他对如何使用上述内容的解释.同样,我没有得到这个功劳:
默认情况下,日志记录模块会打印关键,错误和警告消息.要更改此值以便打印所有级别,请使用:
$ ./your-program.py --logging=debug
Run Code Online (Sandbox Code Playgroud)
要将日志消息发送到名为debug.log的文件,请使用:
$ ./your-program.py --logging-level=debug --logging-file=debug.log
Run Code Online (Sandbox Code Playgroud)
Cas*_*ash 20
可以打印执行的Python行(感谢Geo!).这有任意数量的应用程序,例如,您可以修改它以检查何时调用特定函数或添加类似##的内容使其仅跟踪特定行.
code.interact将您带入交互式控制台
import code; code.interact(local=locals())
Run Code Online (Sandbox Code Playgroud)
如果您希望能够轻松访问控制台历史记录,请查看:" 我可以在shell中使用历史机制吗? "(将不得不向下看).
可以为解释器启用自动完成.
has*_*sen 17
print
声明
debug_print
功能而不是打印,以便轻松禁用pprint
模块对于复杂结构非常有用vin*_*ios 16
调试脚本的明显方法
python -m pdb script.py
Run Code Online (Sandbox Code Playgroud)
如果您不确切知道该脚本的位置
python -m pdb ``which <python-script-name>``
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
rpdb2
是一个远程Python调试器,可以与WinPDB一起使用,WinPDB是一个可靠的图形化调试器.因为我知道你会问,它可以做我希望图形调试器做的一切:)
我使用pdb
,nose.tools
以便我可以调试单元测试以及普通代码.
最后,F7
映射将打印回溯(类似于异常气泡到堆栈顶部时获得的类型).我发现它真的很有用了几次.
归档时间: |
|
查看次数: |
357784 次 |
最近记录: |