在Python中,如何使用交互式命令行(以及可视化断点?)进行调试



我最近从Matlab转到了Python。Python是一种更好的语言(从计算机科学家的角度来看),但Python IDE似乎都缺少一个重要的东西:

一个合适的交互式调试器。

我正在寻找:

  • 通过在编辑器中单击代码行的旁边,可以以图形方式设置断点。

  • 在调试器中停止时运行ANY CODE的能力,包括从我的代码中调用函数、显示新窗口、播放音频等。

  • 发生错误时,调试器应在错误行自动打开交互式控制台。

  • 使用交互式控制台后,您可以恢复正常执行。

Matlab具有所有这些功能,它们运行得非常好,但我在Python工具中找不到它们。

我试过:

  • PyCharm:交互式控制台很笨重,经常出现故障,而且总是崩溃(我尝试过几个不同的版本和操作系统)。

  • IPython:无法设置断点-以程序方式启动Python控制台:您必须停止代码,插入一行额外的代码,然后从头开始再次运行才能完成此操作。此外,如果不重新导入已导入的函数,则无法访问这些函数。

能够在问题第一次出现时调试和修复问题对我来说非常重要,因为我在经常需要几十分钟才能重新运行的程序中工作(计算神经科学)。

结论:目前没有办法在Python中完成所有这些。让我们希望PyLab的开发能够加速。

在代码的顶部,编写

import pdb

在您的代码中,无论您想在哪里调试,都可以使用以下语句。

pdb.set_trace()

因此,无论何时满足set_trace()语句,都会有一个交互式shell。

然后,您可以使用step(s)next(n)continue(c)等检查执行流程,并打印print var 等变量的值

有关pdb的更多详细信息,请参阅这里的

有很多Python IDE。这里有一个主题:Python使用什么IDE?

  • "通过单击编辑器中代码行旁边的按钮,以图形方式设置断点的功能。"

PyDev有这个。双击灰色边距栏。

  • 在调试器中停止时运行ANY CODE的功能,包括从我的代码中调用函数、显示新窗口、播放音频等

PyDev有这个。这不是唯一一个。PyScripter声明的功能似乎包括这一点。

  • 发生错误时,调试器应在错误行自动打开交互式控制台

PyDev就是这么做的。(我想。或者最坏的情况下,你需要双击控制台消息,说明错误在代码中的位置吗?)

  • 使用交互式控制台后,您可以恢复正常执行

PyDev有这个。它被称为"简历"。这就是工具栏中绿色的"播放"三角形的作用。其他一些软件将此功能称为"继续"。

我一直在寻找同样的东西,但不幸的是,Python IDE目前的功能不如Matlab。对于科学编程,您还希望图形/绘图在完全不同的线程中运行,因此IPython集成至关重要。据我所知,从调试器更改工作空间的Matlab IDE功能是非常独特的,它会影响随后运行的代码。每个功能都存在于一些IDE中,但没有一个存在于所有IDE中:

  • Spyder与科学工具有很好的集成,但它的调试仅限于内置的pdb,它不需要执行任何代码,并且在继续之后会让这些代码影响命名空间
  • PyDev和PyCharm,以及其他一些,都有不错的调试功能,但我认为它与科学工具的集成不好。这意味着,如果您进行绘图,您将无法访问提示。不好

根据我的经验,最接近Wing IDE。这是一个专有产品,但如果你从Matlab过渡到非商业用途,89美元/年应该是可以接受的(你可以先评估它)。但对我来说,我最终决定改变我的工作流程,根本不使用任何复杂的IDE。我看的时候是几年前,所以情况可能有所改善。

您可能还对2013年4月的这篇文章感兴趣,这篇文章题为"评估用于科学Python的IDE"。它也没有真正得出结论。

鉴于您正在从Matlab中进行混合,我建议您查看

Python(x,y)

页面描述如下:

Python(x,y)是一款免费的科学和工程开发软件,基于Python编程语言、Qt图形用户界面和Spyder交互式科学开发环境,用于数值计算、数据分析和数据可视化。

它不会满足你的所有愿望,但当我开始使用来自Matlab的Python时,它确实让我感到很舒服。

希望它能帮助

你可以在iPython笔记本上完成所有这些。使用魔术命令%pdb在出现错误时停止。

如果使用命令行,

alias ipythondebug='ipython --InteractiveShell.pdb true'

在你的~/.配置文件中,会给你像Matlab一样的错误调试。这当然需要安装ipython。

不确定恢复部分。

如果您希望错误调试是永久性的,也可以编辑ipython配置文件。看见https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-pdb

最新更新