问题:如何逐步处理Python代码以帮助调试问题?
在Java / C#中,您可以轻松地逐步执行代码以查找可能出了问题的地方,而IDE使此过程非常人性化。
您能以类似的方式跟踪python代码吗?
回答 0
是! 有一个Python调试器pdb
就是为了这样做!
您可以pdb
使用pdb myscript.py
或通过启动Python程序python -m pdb myscript.py
。
然后,您可以发出一些命令,这些命令已在pdb
页面中记录。
需要记住的一些有用的是:
b
:设置一个断点c
:继续调试,直到遇到断点s
:单步执行代码n
:转到下一行代码l
:列出当前文件的源代码(默认值:11行,包括正在执行的行)u
:浏览堆栈框架d
:向下浏览堆栈框架p
:在当前上下文中打印表达式的值
如果您不想使用命令行调试器,则某些IDE(例如Pydev,Wing IDE或PyCharm)都具有GUI调试器。Wing和PyCharm是商业产品,但是Wing具有免费的“个人”版本,PyCharm具有免费的社区版本。
回答 1
通过使用Python交互式调试器’pdb’
第一步是使Python解释器进入调试模式。
A.从命令行
从python解释器的命令行运行的最直接的方法
$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)
B.口译员
在开发模块的早期版本并进行更多迭代实验时。
$ python
Python 2.7 (r27:82508, Jul 3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)
C.从您的程序内部
对于大型项目和长时间运行的模块,可以使用import pdb和set_trace()从程序内部启动调试, 如下所示:
#!/usr/bin/env python
# encoding: utf-8
#
import pdb
class MyObj(object):
count = 5
def __init__(self):
self.count= 9
def go(self):
for i in range(self.count):
pdb.set_trace()
print i
return
if __name__ == '__main__':
MyObj(5).go()
分步调试进入更多内部
用“ n”执行下一条语句(下一个)
重复最后的调试命令与ENTER
用“ q”退出所有… (退出)
用“ p”打印变量的值…(打印)
a) pa
用“ c”关闭(Pdb)提示(继续)
通过“ l”查看您的位置… (列表)
进入子程序…用“ s”(进入)
继续…但是直到当前子例程的结尾…用“ r”(返回)
分配新值
a) !b =“ B”
设置断点
a) 中断行号
b) 中断函数名
c) 中断filename:linenumber
临时断点
a) 中断行号
条件断点
a) 中断行号,条件
注意:**所有这些命令应从** pdb执行
有关深入的知识,请参阅:-
https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/
回答 2
python中有一个名为“ pdb”的模块。在python脚本的顶部,您可以执行
import pdb
pdb.set_trace()
您将进入调试模式。您可以使用’s’步进,’n’跟随下一行,类似于使用’gdb’调试器进行的操作。
回答 3
从Python 3.7开始,您可以使用breakpoint()
内置函数进入调试器:
foo()
breakpoint() # drop into the debugger at this point
bar()
默认情况下,breakpoint()
将导入pdb
并调用pdb.set_trace()
。但是,您可以通过sys.breakpointhook()
使用环境变量来控制调试行为PYTHONBREAKPOINT
。
有关更多信息,请参见PEP 553。
回答 4
ipdb(IPython调试器)
ipdb在pdb中添加了IPython功能,提供了以下巨大改进:
- 制表符完成
- 显示更多上下文行
- 语法高亮
就像pdg一样,与GDB相比,ipdb仍然远远不够完善和完全初级,但是与pdb相比已经有了很大的改进。
用法类似于pdb
,只需使用以下命令进行安装:
python3 -m pip install --user ipdb
然后添加到您要从中逐步调试的行:
__import__('ipdb').set_trace(context=21)
您可能想从编辑器中为其添加快捷方式,例如,对于我拥有的Vim片段:
snippet ipd
__import__('ipdb').set_trace(context=21)
这样我就可以输入,ipd<tab>
并且它会扩展到断点。dd
由于所有内容都包含在一行中,因此删除它很容易。
context=21
增加了上下文行的数量,如下所述:在调试时如何使ipdb显示更多上下文行?
另外,您也可以从头开始调试程序:
ipdb3 main.py
但是您通常不想这样做,因为:
- 您将必须遍历所有函数和类的定义,因为Python会读取这些行
- 我不知道如何在不入侵ipdb的情况下设置上下文大小。补丁以允许它:https : //github.com/gotcha/ipdb/pull/155
或者,就像在原始pdb 3.2+中一样,您可以从命令行设置一些断点:
ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py
虽然-c c
由于某种原因而损坏了:https : //github.com/gotcha/ipdb/issues/156
python -m module
在以下位置询问了调试问题:如何从命令行调试使用python -m运行的Python模块?由于Python 3.7可以通过以下方式完成:
python -m pdb -m my_module
与GDB相比,pdb和ipdb严重缺少的功能:
- 跨会话的持久命令历史记录:将命令历史记录保存在pdb中
ipdb的烦恼:
- 如果您不修改某些设置,那么多线程将无法正常工作…
已在Ubuntu 16.04,ipdb == 0.11,Python 3.5.2中进行了测试。
回答 5
breakpoint()
如今有一种方法可以代替import pdb; pdb.set_trace()
。
它还具有一些新功能,例如可能的环境变量。
回答 6
回答 7
如果您想要具有集成调试器的IDE,请尝试PyScripter。
回答 8
https://wiki.python.org/moin/PythonDebuggingTools
pudb是pdb的很好的替代品
回答 9
Python Tutor是面向新手的在线单步调试器。您可以在编辑页面上放入代码,然后单击“可视化执行”以开始运行。
除其他外,它支持:
但是它也不支持很多东西,例如:
- 读取/写入文件-使用
io.StringIO
和io.BytesIO
代替:演示 - 代码太大,运行时间太长或定义了太多变量或对象
- 命令行参数
- 很多标准库模块,例如argparse,csv,枚举,html,os,struct,weakref …
回答 10
也可以以编程方式步进和跟踪python代码(而且很简单!)。有关更多详细信息,请参见sys.settrace()文档。另外,这里还有一个入门指南。
回答 11
带有PTVS的Visual Studio可能是您的选择:http : //www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx
回答 12
PyCharm是适用于Python的IDE,其中包含调试器。观看此YouTube视频,以获取有关使用PyCharm调试器逐步执行代码的介绍。
注意:这并不是要背书或评论。PyCharm是一种需要付费的商业产品,但该公司确实向学生和教师提供了免费许可,以及免费和开放源代码的“轻量级”社区版本。