使用 IPython 逐步调试

2024-03-23

据我了解,Python 中有两种调试代码的方法:

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

  • Using IPython by 嵌入 http://ipython.org/ipython-doc/dev/interactive/reference.html#embedding-ipython代码中的 IPython shell。你可以做from IPython import embed,然后使用embed()在你的代码中。当你的程序/脚本遇到embed()语句后,您将进入 IPython shell。这允许使用所有 IPython 功能对对象进行全面检查并测试 Python 代码。然而,当使用embed()你不能一步步不再使用方便的键盘快捷键来浏览代码。

有没有办法结合两全其美? IE。

  1. 能够一步步使用方便的 pdb/ipdb 键盘快捷键浏览您的代码。
  2. 在任何此类步骤(例如,在给定的声明上),都可以访问成熟的IPython外壳.

IPython调试as in MATLAB:

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

Emacs 和其他编辑器中的 IPython 调试:

我不想让问题太具体,但我主要在 Emacs 中工作,所以我想知道是否有任何方法可以将此功能引入其中。Ideally,Emacs(或编辑器)将允许程序员在代码的任何位置设置断点,并与解释器或调试器通信,使其停止在您选择的位置,并在该位置引入完整的 IPython 解释器。


ipdb.set_trace() 怎么样?在你的代码中:

import ipdb; ipdb.set_trace()

update:现在在Python 3.7中,我们可以编写breakpoint()。其工作原理相同,但也遵循PYTHONBREAKPOINT环境变量。这个功能来自于this PEP https://www.python.org/dev/peps/pep-0553/.

这允许对您的代码进行全面检查,并且您可以访问以下命令c(继续),n(执行下一行),s(进入该点的方法)等等。

See the ipdb 仓库 https://github.com/gotcha/ipdb and 命令列表 https://wangchuan.github.io/coding/2017/07/12/ipdb-cheat-sheet.html. IPython https://ipython.org/现在被称为(编辑:部分)Jupyter https://jupyter.org/.


ps:请注意,ipdb 命令优先于 python 代码。所以为了写list(foo)你需要print(list(foo)), or !list(foo) .

另外,如果您喜欢 ipython 提示符(它的 emacs 和 vim 模式、历史记录、完成等),那么您的项目很容易获得相同的提示符,因为它基于python提示工具包 https://github.com/jonathanslenders/python-prompt-toolkit/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 IPython 逐步调试 的相关文章

随机推荐