我的代码中出现了很多错误。因此,我希望能够在开始时最小化它们,或者在代码执行之前尽可能多地看到错误。这是可能的,如果是这样,我该怎么做?
答案 0 :(得分:35)
如果您遇到语法问题,可以尝试使用语法高亮显示的编辑器。在你对某种语言有所了解之前,简单的错误不会只是突然出现在你身上。
最简单的调试形式只是插入一些打印语句。更高级(和可扩展)的方法是使用std lib中的logging模块。
交互式解释器是使用python代码的绝佳工具,IPython是对内置REPL(读取评估打印循环)的一个很大的改进。
如果您真的想要逐步执行代码,则调用python调试器pdb,可以从命令行调用,也可以嵌入代码中。
如果您习惯使用完全集成的IDE,我建议将Eclipse与pydev一起使用,PyCharm有一个很好的商业产品,具有自动完成功能,快速访问文档,以及众多快捷方式,以及许多其他有趣的功能。
答案 1 :(得分:30)
以下是一些便于在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调试器,如果你需要的话。
答案 2 :(得分:15)
所有非常酷的东西都可以在交互式解释器中轻松演示。我认为这可能是良好设计的“黄金标准”:
你能以交互方式锻炼课程吗?
如果你能以交互方式做事,那么你可以自信地编写单元测试和doctests,它是可测试的,简单的,可靠的。
而且,更重要的是,您可以以交互方式进行探索。没有什么比通过输入代码并确切了解发生了什么而获得的即时满足感更好。
编译语言的习惯(写一堆东西,调试一堆东西,测试一堆东西)可以留下。相反,你可以写一些东西,探索它,编写一个正式的测试,然后将你的一些东西附加到你不断增长的最终项目中。
你仍然做整体设计。但是你不要浪费时间编写可能会或可能不会工作的代码。在Python中,您可以编写有效的代码。如果你不确定,你会以交互方式玩它,直到你确定。然后你编写有效的代码。
答案 3 :(得分:10)
Python提供了一个调试器,它允许您逐步执行代码,检查变量并对其进行操作。请参阅http://pythonconquerstheuniverse.wordpress.com/category/python-debugger/,它可以带您完成这些步骤......
另请检查pdb的python标准库引用 http://www.python.org/doc/2.5.2/lib/module-pdb.html
答案 4 :(得分:10)
我是python的新手,并且一直在尝试几种不同的调试器。以下是我目前遇到的选项:
内存调试 - 为了调试内存问题,我遇到了一些工具:
这是一个非常不完整的清单,但希望这是一个良好的开端。
答案 5 :(得分:7)
提前测试并经常测试。
这并不一定意味着首先跳入测试驱动的设计池头(虽然这不是一个坏主意)。它只是意味着,只要你有一些有效的东西,就测试你的对象和方法。在进行测试之前,不要等到你有大量的代码。
投入一些时间学习测试框架。如果您输入测试用例很简单,那么您更有可能这样做。如果你没有任何类型的框架测试可能会很痛苦,所以你会避免它。所以,尽早建立一些好习惯,你将会遇到更少的问题。
答案 6 :(得分:7)
通常,我只是使用一堆打印语句。
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之类的东西。对于这个允许单步执行代码并设置断点的调试器很有用。
Python中包含 pdb
。 Here是一个很好的简单教程。您甚至可以在运行时更改变量(本教程将介绍)。可以找到更长的教程here
有一个非常好的GUI等效pdb - Winpdb
基本上你运行winpdb myscript --arg 4 -b 4
然后它在终端加载命令,在左边显示你的代码,包含当前,本地/全局变量列表(及其值)和当前调用栈
然后,您可以通过单击Step(或F6)来逐步执行代码。 F5运行代码。如果单击行号旁边的,它会设置一个断点,代码将自动步进(当您按下运行时)。
我发现它更容易使用,并且它有许多附加增强功能(如远程调试,因此您可以在待调试的应用程序中运行后端部分(rpdb2
),并将Winpdb连接到它(加密)。它还支持线程和PDB中没有的其他有用的东西。你也可以访问类似pdb的控制台。
答案 7 :(得分:6)
我设置Python以在有未捕获的异常时使用this trick自动启动调试器。这样,您可以轻松地检查程序的状态,而无需太多的日志记录代码。 (另外,给我一个Growl notification。)
哦,这样你就可以通过添加
在代码中创建一个断点if answer == 42:
1/0
答案 8 :(得分:5)
大量使用assert语句。
答案 9 :(得分:4)
执行前识别错误是静态检查/分析的领域。我很幸运使用PyChecker进行Python代码的基本静态检查。
pycheesecake网站对Python有很好的summary of testing tools。
答案 10 :(得分:4)
eclipse的PyDev插件是我的首选工具。它识别简单的语法错误和缩进错误,并用红线突出显示错误。它有一个功能强大的调试器,甚至还有一个名为PyLint的插件,它会警告你危险的代码。
编辑: 它还具有关于运行时错误,部分自动完成和一些其他漂亮功能的用户友好堆栈跟踪。
再次编辑: 我没有注意到顶部帖子中提到了pydev。我希望我带来了别的东西。
答案 11 :(得分:1)
python -m pdb yourcode.py应该这样做。 或者,您可以在代码中“导入pdb”并使用pdb.set_trace()来设置断点。 有关详细信息,请参阅手册:http://www.python.org/doc/2.5.2/lib/module-pdb.html
答案 12 :(得分:1)
非常好的Python调试器名为Winpdb。试试吧。建立在wxWidgets库和多平台上。
答案 13 :(得分:1)
要获得最完整的体验,您可以使用像PyCharm这样的完整IDE:
http://blog.jetbrains.com/pycharm/files/2011/05/template-debug2.png
答案 14 :(得分:0)
Eric4 IDE还有一个很棒的内置调试器。
答案 15 :(得分:0)
IPython Python shell有一个%pdb
命令automatically invokes the debugger以防出现问题。然后,您可以检查变量,逐步执行代码等。
您可以使用%run
命令从IPython中run your programs。
更一般地说,正如其他一些答案中所提到的,一个好的Python shell是你的朋友。 IPython是你最好的朋友。 :)