【问题标题】:Debugging with breakpoints from console in Python在 Python 中使用控制台中的断点进行调试
【发布时间】:2013-03-22 11:23:34
【问题描述】:

我正在尝试从 Matlab 迁移到 python。 Matlab 的优点之一是,在调试时,我可以在某些代码中设置断点,然后在命令行中调用该代码。使用 PyCharm + IPython 我还没有找到在 Python 中执行此操作的方法。似乎我必须在调试模式下运行整个脚本才能进行任何调试,而不是通过一个简单的命令来完成。我想我可以用我感兴趣的命令编写一个单行脚本,但似乎应该有更好的方法。这样做的 Python 方法是什么?

【问题讨论】:

    标签: python debugging matlab ipython


    【解决方案1】:

    尝试使用python debugger

    b(reak) [[filename:]lineno | function[, condition]]
    

    pdb.set_trace();
    

    更详细的教程可以found here

    【讨论】:

      【解决方案2】:

      我想推荐使用Python Tools for Visual Studio。它是免费和开源的,虽然 Visual Studio 本身显然不是开源的,但 ("PTVS Integrated") 附带了一个免费且功能强大的 Visual Studio 版本,允许商业使用。此外,大多数学术机构的学生和工作人员都可以通过Dreamspark免费访问 Visual Studio Ultimate。

      如果您的程序在断点处停止,您可以打开“Python Debug Interactive”(从工具->python 工具),这将打开一个交互式 python shell,可以访问程序命名空间中的所有可用变量断点,就像在 Matlab 中一样。

      将鼠标悬停在源代码中的变量上也会显示值,调出“locals”窗口或多或少模拟了 Matlab 中的工作区查看器,您还可以“观察”特定变量。不过不知道通过这个界面编辑变量是否安全,慎用!

      不幸的是,PTVS 没有嵌套断点,这在 Matlab 调试器中是一个非常有用的功能。因此,如果您在断点处停止并从调试交互式窗口调用方法,则该方法中的任何断点都将不起作用。见this related question

      与 Matlab 或 ipython 相比,调试 shell 中基于箭头键的命令历史记录相当原始,而且 Intellisense 不如原生 .net 语言好,但我在后半段一直在使用它- 现在大约一年,除了出色的文档之外,我真的不觉得我在 Matlab 中缺少太多东西。

      需要注意的另一件事是,在调试模式下的代码执行性能要慢得多,因此我建议在没有调试模式的情况下运行代码(使用“Ctrl+F5”而不是“F5”)以获得最佳性能,或者新的mixed mode debugger,如果你需要断点和良好的性能。

      【讨论】:

        【解决方案3】:

        你试过 Spyder 吗??? 这是一个与 Matlab 非常相似的开源 IDE。它还提供了您想要的调试器。 https://code.google.com/p/spyderlib/

        PS:我也在迁移到 python,但我正在避免这样的事情,因为我想从一个空的头脑开始。 :) 但是我读了很多从 Matlab 到 Numpy 的文本...

        【讨论】:

        • 是的,我看过了。似乎是朝着正确方向迈出的一步,但远不如 Matlab 完善。我想很多人会在接下来的几年里从 Matlab 迁移到 Python。有一个巨大的机会可以为模仿 Matlab 的 Python 创建一个用户友好的优美环境。怀疑与 Matlab 不同,它需要大量的 b/c 开发工作,不需要对语言本身进行任何工作,只需要组合包并制作一个不错的 IDE/研究环境
        • PS:我下载了 Spyder :) 我错过了一个好的调试器并看到了我的工作区变量。
        • 与 IDE 的 Matlab 相比,您觉得它如何?你一般觉得 Python 怎么样?
        【解决方案4】:

        我已经从 matlab 和 R 转移到 python。我尝试了不同的编辑器,所以我可以给你一些建议。

        1- Spyder 更接近于 matlab 但我的印象是它不是很好。当我开始使用大量数据运行长时间模拟时,它经常崩溃。 如果你是 python 新手,我建议你先用这个,然后再换别的。

        2-emacs python 模式。效果很好。在我看来,如果你不熟悉 python,它很难配置,可能不是最好的选择。

        3- pycharm。我刚开始用pycharm,感觉很好用(这让我想起了我的Rstudio)。我不认为这支持像 spyder 或 emacs 中那样的交互式控制台。 在调试模式下仍然可以得到类似的东西

        4- 很多人喜欢 ipython notebook,但我认为这不是长代码的好选择。如果您想要一些易于可视化的东西,那就太好了。

        【讨论】:

        • 我一直在使用 PyCharm,对它非常满意。除了已经很棒的 IDE 之外,还有一些出色的支持 iPython、实时变量窗口等的广告支持。
        • 你会使用交互式控制台吗?
        • 是的,我上次尝试绘图时它不起作用,似乎在一些并行处理的东西上窒息,但似乎对其他一切都很好。
        【解决方案5】:

        既然您提到您使用的是ipython,您也可以查看ipdb

        您必须先通过pipeasy_install 安装它。等等:

        pip install ipdb
        

        用法同pdb。 ipython 控制台将弹出您放置ipdb.set_trace() 的位置,您可以从中检查/更改本地全局变量,检查它们的文档和类型,进入传入函数的代码(使用's',您将转到@ 的定义987654328@)等

        import ipdb;
        
        code000()
        ipdb.set_trace();
        code123()
        

        还有关于如何从 ipython 获取 ? 功能的提示(关于在调试器中获取函数和模块的文档)。 This answer.

        【讨论】:

        • 好的,谢谢,就像你说的那样。有没有办法让它与 IDE 图形调试器一起工作。我已经习惯了 Matlab 中漂亮的图形调试器,发现控制台调试器有点不友好...
        • 有一个叫winpdb
        • 抱歉,误解了您的问题。不知道 pycharm vas 是一个 IDE,以为它只是您使用的一些框架:)
        • %run -d 可以让你停在某个精确的线。见%run?
        【解决方案6】:

        在您使用pdb.set_trace()的控制台create function中,然后您要调试的函数。

        >>> import pdb
        
        >>> def f():
        ...     pdb.set_trace()
        ...     my_function()
        ... 
        

        然后调用创建的函数:

        >>> f()
        > <stdin>(3)f()
        (Pdb) s
        --Call--
        > <stdin>(1)my_function()
        (Pdb) 
        

        调试愉快:)

        【讨论】:

          【解决方案7】:

          要在 python3.7+ 中输入永久断点,请在源文件中插入表达式 breakpoint()。没有更多的need to import anything, even pdb。在未编译的 Matlab 中,等同于 breakpoint() 的语句是 keyboard

          全局情况是,在 python 的调试提示 (Pdb)(显示为 breakpoint())之后,您可以在 python 语句前面加上感叹号(!),而在 Matlab 的调试提示 K&gt; 之后,您必须在调试命令前添加db

          我也在从 Matlab 迁移到 Python。我习惯于在matlab -nodisplay 内部调试,并在没有 IDE 的情况下切换到 python3.10。这些非常相似。所以我可以很容易地在下面创建与调试相关的罗塞塔石碑。

          您可以使用命令tbb,从(Pdb) 提示符(或在您的文件$HOME/.pdbrc)创建其他断点。作为他们的 Matlab 对应物dbstop,您可以将它们设置为另一个文件、另一行并让它们有条件。

          这是一个简短的罗塞塔石:

          python python's available shortcut Matlab
          breakpoint() keyboard
          where w dbstack
          cont c dbcont
          up u dbup
          down d dbdown
          step s dbstep
          next n dbnext
          print expression p expression expression
          !nonlocal var;var= var=
          break b dbstop and dbstatus
          clear cl dbclear
          list l dbtype
          display d variable window
          help h help

          Matlab 没有对应的:

          • ignore n p(第n个断点只会在第p次执行后触发提示)
          • prettyprint 表达式(快捷方式:pp
          • jump codelinenumber(快捷方式:j

          我仍然不知道 Python 是否有任何可用的 save and loadevalin(caller,expr) 等价物,以及调试时的绘图。

          【讨论】:

          • 啊,表格的格式终于正确了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-03
          • 2015-11-26
          • 2019-08-22
          相关资源
          最近更新 更多