9

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

4

7 回答 7

4

尝试使用python 调试器

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

或者

pdb.set_trace();

更详细的教程可以在这里找到

于 2013-03-22T11:25:54.703 回答
4

我想推荐使用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 调试器中是一个非常有用的功能。因此,如果您在断点处停止并从调试交互式窗口调用方法,则该方法中的任何断点都将不起作用。请参阅此相关问题

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

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

于 2013-05-14T09:07:00.920 回答
2

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

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

于 2013-05-06T19:18:04.177 回答
2

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

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

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

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

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

于 2014-05-12T15:24:49.750 回答
0

既然你提到你正在使用ipython,你也可以检查一下ipdb

您必须先通过pip或安装它easy_install。ETC:

pip install ipdb

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

import ipdb;

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

还有一个关于如何?从 ipython 获取功能的提示(关于在调试器中获取函数和模块的文档)。这个答案

于 2013-03-22T11:32:41.920 回答
0

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

>>> import pdb

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

然后调用创建函数:

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

调试愉快:)

于 2019-01-16T20:35:27.110 回答
0

要在 python3.7+ 中输入永久断点,请breakpoint()在源文件中插入表达式。不再需要导入任何东西,甚至pdb. 在非编译的 Matlab 中,等价于breakpoint()语句keyboard

全局情况是,在 python 的调试提示符之后(Pdb)(由 显示breakpoint()),您在!调试命令之前添加,而在 Matlab 的调试提示符之后,您在调试命令之前添加。K>db

我也在从 Matlab 迁移到 Python。我习惯在里面调试matlab -nodisplay,现在在没有IDE的情况下切换到python3.10。这些非常相似。所以我会继续这个调试相关的罗塞塔石碑。

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

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

Python python的可用快捷方式 MATLAB
breakpoint() keyboard
where w dbstack
cont c dbcont
up u dbup
down d dbdown
step s dbstep
next n dbnext
print表达 p表达 表达
!nonlocal 变种;变种= 变量=
break b dbstopdbstatus
clear cl dbclear
list l dbtype
display d 可变窗口

Matlab 没有等价物:

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

我仍然不知道 Python 在调试时是否有任何可用的saveandloadevalin(caller,expr)和 plots 等价物。

于 2022-02-07T16:18:45.463 回答