我正在尝试从 Matlab 迁移到 python。Matlab 的优点之一是,在调试时,我可以在某些代码中设置断点,然后执行一些操作以从命令行调用该代码。使用 PyCharm + IPython 我还没有找到在 Python 中执行此操作的方法。看来我必须在调试模式下运行整个脚本才能进行任何调试,而不是能够通过一个简单的命令来进行。我想我可以用我感兴趣的命令编写一个单行脚本,但似乎应该有更好的方法。这样做的 Python 方法是什么?
7 回答
尝试使用python 调试器
b(reak) [[filename:]lineno | function[, condition]]
或者
pdb.set_trace();
更详细的教程可以在这里找到。
我想推荐使用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”)以获得最佳性能,或者如果您需要断点和良好的性能,则可以使用新的混合模式调试器。
你试过蜘蛛???这是一个与 Matlab 非常相似的开源 IDE。它还提供了您想要的调试器。 https://code.google.com/p/spyderlib/
PS:我也在迁移到 python,但我正在避免这样的事情,因为我想从一个空的头脑开始。:) 但我读了很多从 Matlab 到 Numpy 的文本......
我已经从 matlab 和 R 转移到 python。我尝试了不同的编辑器,所以我可以给你一些建议。
1- Spyder 更接近于 matlab 但我的印象是它不是很好。当我开始使用大量数据运行长时间模拟时,它经常崩溃。如果您是 python 新手,我建议您先使用这个,然后再使用其他东西。
2-emacs python模式。效果很好。在我看来,如果你不熟悉 python,它很难配置,可能不是最好的选择。
3-pycharm。我刚开始用pycharm,感觉很好用(这让我想起了我的Rstudio)。我不认为这支持像 spyder 或 emacs 中那样的交互式控制台。您仍然可以在调试模式下获得类似的东西
4- 很多人喜欢 ipython notebook,但我认为这不是长代码的好选择。如果您想要一些易于可视化的东西,那就太好了。
既然你提到你正在使用ipython
,你也可以检查一下ipdb
。
您必须先通过pip
或安装它easy_install
。ETC:
pip install ipdb
用法与pdb相同。ipython 控制台将弹出您放置ipdb.set_trace()
的位置,您可以从中检查/更改本地全局变量,检查它们的文档和类型,进入传入函数的代码(使用“s”,您将转到 的定义code123()
)等。
import ipdb;
code000()
ipdb.set_trace();
code123()
还有一个关于如何?
从 ipython 获取功能的提示(关于在调试器中获取函数和模块的文档)。这个答案。
在使用 pdb.set_trace()的控制台创建函数中,然后使用要调试的函数。
>>> import pdb
>>> def f():
... pdb.set_trace()
... my_function()
...
然后调用创建函数:
>>> f()
> <stdin>(3)f()
(Pdb) s
--Call--
> <stdin>(1)my_function()
(Pdb)
调试愉快:)
要在 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 |
dbstop 和dbstatus |
clear |
cl |
dbclear |
list |
l |
dbtype |
display |
d |
可变窗口 |
Matlab 没有等价物:
ignore
np(第n个断点只会在第p次执行后触发提示)prettyprint
表达式(快捷方式pp
:)jump
代码行号(快捷方式j
:)
我仍然不知道 Python 在调试时是否有任何可用的save
andload
、evalin(caller,expr)
和 plots 等价物。