我的代码中出现了很多错误.因此,我希望能够在开始时将它们最小化,或者在代码执行之前尽可能多地查看错误.这是可能的,如果是这样,我该怎么做?
如果您遇到语法问题,可以尝试使用语法高亮显示的编辑器.在你对某种语言有所了解之前,简单的错误不仅会突然出现在你面前.
最简单的调试形式就是插入一些print语句.更高级(和可扩展)的方法是使用std lib中的日志记录模块.
交互式解释器是使用python代码的绝佳工具,而IPython是对内置REPL(读取评估打印循环)的重大改进.
如果您真的想要单步调试代码,则python调试器称为pdb,可以从命令行调用,也可以嵌入代码中.
如果您习惯使用完全集成的IDE,我建议将Eclipse与pydev一起使用,PyCharm有一个很好的商业产品,具有自动完成功能,快速访问文档,以及众多快捷方式,以及许多其他有趣的功能.
以下是一些便于在Python中进行调试的技巧:
使用交互式shell,例如ipython.Python是一种动态语言,您可以在键入时浏览代码.shell始终在我的编辑器的第二个窗口中运行.
从shell复制粘贴到docstrings中的代码,用于说明函数(类,模块)的主要用法和极端情况.doctest.testmod()
放在一个if __name__=="__main__"
部分允许测试模块中的所有文档字符串.doctest可以很容易地与unittest集成.
使用assert
的东西,永远不会发生.
print()
可以解决很多调试问题; logging模块适用于长寿python进程.
编写测试(不一定在你的代码之前),经常运行它们(自动或最多一次击键); nose为unittest提供扩展的测试发现和运行功能.
偶尔跑pylint.
此时,正式的python调试器有一点用处. 如果需要,Winpdb是一个外部多平台GPL的GUI python调试器.
所有非常酷的东西都可以在交互式解释器中轻松演示.我认为这可能是优秀设计的"黄金标准":
你能以交互方式锻炼课程吗?
如果你可以交互式地完成工作,那么你可以自信地编写单元测试和doctests,它是可测试的,简单的,可靠的.
而且,更重要的是,您可以以交互方式进行探索.没有什么比通过输入代码并确切地看到发生了什么而获得的即时满足感更好.
编译的语言习惯(写一堆东西,调试一堆东西,测试一堆东西)可以留下.相反,你可以写一些东西,探索它,编写一个正式的测试,然后将你的一些东西附加到你不断增长的最终项目中.
你仍然做整体设计.但是你不要浪费时间编写可能会或可能不会工作的代码.在Python中,您可以编写有效的代码.如果你不确定,你会以交互方式玩它,直到你确定.然后你编写有效的代码.
Python提供了一个调试器,允许您逐步执行代码,检查变量并对其进行操作.请参阅http://pythonconquerstheuniverse.wordpress.com/category/python-debugger/,它可以带您完成这些步骤......
另请检查pdb的python标准库参考 http://www.python.org/doc/2.5.2/lib/module-pdb.html
我是python的新手,并且一直在尝试几种不同的调试器.以下是我到目前为止遇到的选项:
Eclipse与Pydev - 如果你已经在使用eclipse,这可能就是你要走的路.调试器运行良好,功能非常强大.
Komodo IDE - 轻量级的Python IDE.基本上是文本编辑器+调试器.很容易找到并立即提高工作效率.
WinPDB - 接下来尝试这个.看起来很有特色,我可以使用我选择的任何编辑器.
PDB - 自从我读到WinPDB是一个更好的选择之后,还没有尝试过.
带有%run命令的Ipython - 我使用过IPython,但不是像这样的调试器.我需要尝试一下.(感谢提示,EOL)
Eric IDE - 也在列表中尝试.
老派打印,断言语句 - 简单,有用,但不是完整的解决方案.
内存调试 - 为了调试内存问题,我遇到了一些工具:
objgraph - 将生成参考图的png.整齐.还有其他功能,例如:import objgraph; print(objgraph.show_most_common_types(limit = 10))将打印内存中排名前10位的最常见类型.
gc模块 - 直接与垃圾收集器交互.
heapy - 堆分析器.例如:来自guppy import hpy; hp = hpy(); print(hp.heap())将打印最常见的类型,它们的内存使用情况等.
这是一个非常不完整的列表,但希望这是一个良好的开端.
尽早测试并经常测试.
这并不一定意味着首先跳入测试驱动的设计池头(虽然这不是一个坏主意).它只是意味着,只要你有一些有效的东西,就测试你的对象和方法.在进行测试之前,不要等到你有大量的代码.
花一些时间学习测试框架.如果您输入测试用例很简单,那么您更有可能这样做.如果你没有任何类型的框架测试可能会很痛苦,所以你会避免它.所以,尽早建立一些好习惯,你将会遇到更少的问题.
通常,我只使用一堆打印语句.
page = grabpage(url) print "Page content:", page print "page type():", type(page)
做以下事情有时很有用:
debug = True if debug: print "page content", page
..通过将调试变量更改为False,您可以快速禁用所有调试打印语句.
虽然在大多数情况下打印调试会让你走得很远,但有时很难调试循环或一系列if/else/try/except/etc之类的东西.对于这个允许单步执行代码并设置断点的调试器很有用.
pdb
包含在Python中.这是一个很好的简单教程.您甚至可以在运行时更改变量(本教程将介绍).可以在这里找到更长的教程
有一个非常好的GUI等效的pdb - Winpdb
基本上你运行winpdb myscript --arg 4 -b 4
它然后它在终端加载命令,在左边显示你的代码,当前,本地/全局变量(及其值)列表和当前调用堆栈.
然后,您可以通过单击Step(或F6)来逐步执行代码.F5运行代码.如果单击行号旁边的,则会设置一个断点,代码将自动跳转(当您按下运行时).
我发现它更容易使用,它有很多额外的增强功能(比如远程调试,所以你可以rpdb2
在待调试的应用程序中运行后端部分(),并将Winpdb连接到它(加密).它还有支持不在PDB中的线程和其他有用的东西.你也可以访问类似pdb的控制台.
我设置Python以在有未捕获的异常时使用此技巧自动启动调试器.这样,您可以轻松地检查程序的状态,而无需太多的日志记录代码.(另外,向我发送一个低吼通知.)
哦,这样你就可以通过添加在代码中创建一个断点
if answer == 42: 1/0
自由地使用断言语句.