根据我的阅读,在 Python 中调试代码有两种方法:
使用传统的调试器,例如 pdb
或 ipdb
。这支持诸如 c
for continue
、n
for step-over
、s
for step-into
等),但您无法直接访问 IPython shell,这对于对象检查非常有用。
使用 IPython by embedding代码中的 IPython shell。您可以执行 from IPython import embed
,然后在代码中使用 embed()
。当您的程序/脚本遇到 embed()
语句时,您将进入 IPython shell。这允许使用所有 IPython 好东西来全面检查对象和测试 Python 代码。但是,当使用 embed()
时,您不能再通过方便的键盘快捷键逐步通过代码。
有没有什么方法可以结合两全其美?即
可以在 MATLAB 中找到此类“增强调试”的示例,其中用户始终可以完全访问 MATLAB 引擎/shell,并且她仍然可以逐步-单步通过她的代码,定义条件断点等。根据我与其他用户的讨论,这是人们从 MATLAB 迁移到 IPython 时最怀念的调试功能。
我不想让这个问题太具体,但我主要在 Emacs 中工作,所以我想知道是否有任何方法可以将这个功能引入其中。 理想情况下,Emacs(或编辑器)将允许程序员在代码的任何位置设置断点,并与解释器或调试器通信,让它停在您选择的位置,并带来完整的 IPython该位置的口译员。
最佳答案
ipdb.set_trace() 怎么样?在您的代码中:
导入ipdb; ipdb.set_trace()
更新:现在在 Python 3.7 中,我们可以编写 breakpoint()
。它的工作原理相同,但它也服从 PYTHONBREAKPOINT
环境变量。此功能来自 this PEP .
这允许对您的代码进行全面检查,并且您可以访问诸如 c
(继续)、n
(执行下一行)、s 等命令
(单步进入该方法)等等。
见 ipdb repo和 a list of commands . IPython现在称为(编辑:部分)Jupyter .
ps:请注意,ipdb 命令优先于 python 代码。所以为了编写 list(foo)
你需要 print(list(foo))
或 !list(foo)
。
此外,如果您喜欢 ipython 提示符(它的 emacs 和 vim 模式、历史记录、完成...),您的项目很容易获得相同的提示符,因为它基于 python prompt toolkit .
https://stackoverflow.com/questions/16867347/