13

嘿,我想知道...我正在将 pydev 与 eclipse 一起使用,我真的很喜欢强大的调试功能,但我想知道:

是否可以在eclipse中设置断点并在执行过程中跳转到交互式python解释器?

我认为那会很方便;)

编辑:我想强调我的目标不是跳入调试器。pydev/eclipse 有一个很棒的调试器,我可以只看回溯并设置断点。

我想要的是执行一个脚本并在执行过程中跳转到一个交互式 python 解释器,这样我就可以做一些事情......

  • 闲逛
  • 检查事物的价值
  • 操纵变量
  • 在我将它添加到应用程序之前找出一些代码

我知道你可以用调试器完成这一切,但我可​​以在交互式解释器中更快地完成,因为我可以尝试一些东西,看到它不起作用,然后尝试其他东西,而无需让应用程序回到执行点又是那个代码。

4

5 回答 5

9

从 OP 的问题开始大约一年后,PyDev 内置了这个功能。我不确定这个功能是什么时候引入的,但我所知道的是我已经花了大约 2 小时谷歌搜索......配置 iPython 和任何东西(其中看起来它会完成这项工作),但只是意识到 Eclipse/PyDev 有我想要的 ootb。

一旦您在调试模式下遇到断点,控制台就在那里准备就绪并等待!我只是没有注意到这一点,因为没有提示或闪烁的光标;我错误地认为它是一个标准的、仅输出的控制台……但事实并非如此。它甚至具有代码完成功能。

很棒的东西,有关更多详细信息,请参阅http://pydev.org/manual_adv_debug_console.html

于 2010-09-06T10:28:37.933 回答
6

这是来自一个旧项目,我没有编写它,但它的功能类似于您想要使用 ipython 实现的功能。

'''Start an IPython shell (for debugging) with current environment.                    
Runs Call db() to start a shell, e.g.                                                  


def foo(bar):                                                                          
    for x in bar:                                                                      
        if baz(x):                                                                     
            import ipydb; ipydb.db() # <-- start IPython here, with current value of x (ipydb is the name of this module).
.                                                                                      
'''
import inspect,IPython

def db():
    '''Start IPython shell with callers environment.'''
    # find callers                                                                     
    __up_frame = inspect.currentframe().f_back
    eval('IPython.Shell.IPShellEmbed([])()', # Empty list arg is                       
         # ipythons argv later args to dict take precedence, so                        
         # f_globals() shadows globals().  Need globals() for IPython                  
         # module.                                                                     
         dict(globals().items() + __up_frame.f_globals.items()),
         __up_frame.f_locals)

由 Jim Robert(问题所有者)编辑:如果您将上述代码放入my_debug.py为本示例而调用的文件中。然后将该文件放在您的 python 路径中,您可以在代码中的任何位置插入以下行以跳转到调试器(只要您从 shell 执行):

import my_debug
my_debug.db()
于 2009-06-07T15:41:31.523 回答
3

我长期以来一直在使用此代码sitecustomize.py来启动异常调试器。这也可以通过 Ctrl+C 触发。它在 shell 中工作得很好,不知道 eclipse。

import sys

def info(exception_type, value, tb):
   if hasattr(sys, 'ps1') or not sys.stderr.isatty() or not sys.stdin.isatty() or not sys.stdout.isatty() or type==SyntaxError:
      # we are in interactive mode or we don't have a tty-like
      # device, so we call the default hook
      sys.__excepthook__(exception_type, value, tb)
   else:
      import traceback
      import pdb


      if exception_type != KeyboardInterrupt:
          try:
              import growlnotify
              growlnotify.growlNotify("Script crashed", sticky = False)
          except ImportError:
              pass

      # we are NOT in interactive mode, print the exception...
      traceback.print_exception(exception_type, value, tb)
      print
      # ...then start the debugger in post-mortem mode.
      pdb.pm()

sys.excepthook = info

这是 StackOverflow 的来源更多讨论

于 2009-05-29T14:52:58.723 回答
2

您可以使用此处code.InteractiveConsole描述的方法跳转到交互式会话;但是我不知道如何从 Eclipse 中触发它。

一个解决方案可能是拦截 Ctrl+C 以跳转到这个交互式控制台(使用信号模块:)signal.signal(signal.SIGINT, my_handler),但它可能会改变执行上下文,您可能不希望这样。

于 2009-06-05T15:20:58.470 回答
-2

如果您已经在调试模式下运行,如果程序执行当前暂停(例如,因为您已经在断点处),您可以设置一个额外的断点。我现在刚刚使用最新的 Pydev 进行了尝试——它工作得很好。

如果您正常运行(即不在调试模式下),所有断点都将被忽略。对断点的任何更改都不会改变非调试运行的工作方式。

于 2009-05-29T14:14:00.003 回答