我正在尝试从Matlab迁移到python。关于Matlab的一个好处是,在调试时我可以在某些代码中放置断点并执行某些操作从命令行调用该代码。使用PyCharm + IPython我还没有找到在Python中执行此操作的方法。我似乎必须在调试模式下运行整个脚本来执行任何调试,而不是通过简单的命令来执行此操作。我想我可以用我感兴趣的命令编写一行脚本,但似乎应该有更好的方法。这样做的Python方式是什么?
答案 0 :(得分:4)
我建议使用Python Tools for Visual Studio。它是免费和开源的,虽然Visual Studio本身显然不是开源的,但是("PTVS Integrated")附带一个免费且功能非常强大的Visual Studio版本,允许商业使用。此外,大多数学术机构的学生和员工可以通过Dreamspark免费访问Visual Studio Ultimate。
如果程序在断点处停止,则可以打开“Python Debug Interactive”(来自tools-> python工具),这将打开一个交互式python shell,可以访问程序命名空间中可用的所有变量。断点,就像在Matlab中一样。
在源代码中将鼠标悬停在变量上也会显示该值,显示“locals”窗口或多或少会模拟Matlab中的工作区查看器,您还可以“监视”特定变量。我不知道通过这个界面编辑变量是否安全,请谨慎使用!
不幸的是,PTVS没有嵌套断点,这是Matlab调试器中非常有用的功能。因此,如果您在断点处停止并从调试交互窗口调用方法,则方法中的任何断点都将无效。请参阅this related question。
调试shell中基于箭头键的命令历史与Matlab或ipython相比是非常原始的,而且Intellisense不如原生.net语言那么好,但我在下半年一直坚持使用它现在,除了优秀的文档之外,我并不觉得我在Matlab上错过了很多东西。
另一件需要注意的事情是,在调试模式下代码执行性能要慢得多,所以我建议在没有调试模式的情况下运行代码(使用“Ctrl + F5”而不是“F5”)以获得最佳性能,如果你需要断点和良好的表现,可以使用新的mixed mode debugger。
答案 1 :(得分:3)
尝试使用python debugger
b(reak) [[filename:]lineno | function[, condition]]
或
pdb.set_trace();
更详细的教程可以是found here。
答案 2 :(得分:2)
你试过Spyder ??? 这是一个与Matlab非常相似的开源IDE。它还提供了您需要的调试器。 https://code.google.com/p/spyderlib/
PS:我也正在迁移到python,但我正在避免这样的事情,因为我想从一个空洞的头脑开始。 :)但是我读了许多从Matlab到Numpy文本的内容......答案 3 :(得分:2)
我已经从matlab和R转移到了python。我尝试了不同的编辑器,所以我可以给你一些建议。
1- Spyder更接近matlab,但我的印象是它不是很好。当我开始使用大量数据进行长时间模拟时,它经常会崩溃。 如果你是python的新手,我建议你暂时使用这个,然后转移到其他地方。
2- emacs python模式。效果很好。在我看来,如果你不熟悉python,很难配置,可能不是最好的选择。
3- pycharm。我刚开始使用pycharm,它看起来非常好(这让我想起了Rstudio)。我认为这不支持像spyder或emacs这样的交互式控制台。 您仍然可以在调试模式下获得类似的东西
4-很多人都喜欢ipython笔记本,但我认为这不是长代码的好选择。如果你想要一些易于想象的东西,这是很好的。
答案 4 :(得分:0)
由于您提到您使用的是ipython
,因此您还可以查看ipdb
。
您必须先通过pip
或easy_install
进行安装。等:
pip install ipdb
用法与pdb相同。 ipython控制台将弹出您放置ipdb.set_trace()
的位置,您可以从中检查/更改本地全局变量,检查其文档和类型,进入传入函数的代码(使用's',您将转到定义code123()
)等等。
import ipdb;
code000()
ipdb.set_trace();
code123()
还提示如何从ipython获取?
的功能(关于在调试器中获取函数和模块的文档)。 This answer。
答案 5 :(得分: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)
调试愉快:)