python - 使用 IPython 逐步调试

根据我的阅读,在 Python 中调试代码有两种方法:

  • 使用传统的调试器,例如 pdbipdb。这支持诸如 c for continuen for step-overs for step-into 等),但您无法直接访问 IPython shell,这对于对象检查非常有用。

  • 使用 IPython by embedding代码中的 IPython shell。您可以执行 from IPython import embed,然后在代码中使用 embed()。当您的程序/脚本遇到 embed() 语句时,您将进入 IPython shell。这允许使用所有 IPython 好东西来全面检查对象和测试 Python 代码。但是,当使用 embed() 时,您不能再通过方便的键盘快捷键逐步通过代码。

有没有什么方法可以结合两全其美?即

  1. 能够使用方便的 pdb/ipdb 键盘快捷键逐步完成您的代码。
  2. 在任何此类步骤(例如在给定语句上),都可以访问成熟的 IPython shell

IPython 调试 MATLAB:

可以在 MATLAB 中找到此类“增强调试”的示例,其中用户始终可以完全访问 MATLAB 引擎/shell,并且她仍然可以逐步-单步通过她的代码,定义条件断点等。根据我与其他用户的讨论,这是人们从 MATLAB 迁移到 IPython 时最怀念的调试功能。

在 Emacs 和其他编辑器中调试 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/

相关文章:

linux - 为什么人们使用 tarball?

linux - 如何在 bash 中检查文件是否创建时间超过 x 时间?

javascript - 即使没有其他进程阻塞该端口,Node.js 应用程序也无法在端口 80 上

python - 在 Python 中查找列表的中位数

python - Pandas 用空白/空字符串替换 NaN

linux - SIGINT 与 SIGTERM、SIGQUIT 和 SIGKILL 等其他终止信号

python - 使用 pandas 绘制相关矩阵

python - 多处理。池 : What's the difference between map

linux - 如何在 bash shell 脚本中包含文件

python - 如何在 Python 中创建对象的副本?