代码之家  ›  专栏  ›  技术社区  ›  Jiaaro

跳转到Python交互式会话中间程序?

  •  12
  • Jiaaro  · 技术社区  · 17 年前

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

    编辑

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

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

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

    6 回复  |  直到 17 年前
        1
  •  9
  •   Darren Bishop    16 年前

    因此,从OP的问题开始大约一年后,PyDev内置了这种功能。我不确定这项功能是什么时候推出的,但我所知道的是,我已经花了大约2个小时在谷歌上搜索。。。配置iPython和其他任何东西(看起来它可以完成这项工作),但只是为了实现Eclipse/PyDev拥有我想要的ootb。

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

    好东西,看到了吗 http://pydev.org/manual_adv_debug_console.html 更多细节。

        2
  •  6
  •   Jiaaro    17 年前

    这是从一个老项目,我没有写它,但它做了一些类似于你想要使用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)
    

    吉姆·罗伯特(问题负责人)编辑 :如果将上述代码放入名为 my_debug.py 为了这个例子。然后将该文件放在python路径中,您可以在代码中的任意位置插入以下行以跳转到调试器中(只要从shell执行):

    import my_debug
    my_debug.db()
    
        3
  •  3
  •   Community Mohan Dere    9 年前

    在我的工作中,我一直在使用这个代码 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
    

    source 和 more discussion on StackOverflow .

        4
  •  2
  •   Schnouki    17 年前

    您可以使用 code.InteractiveConsole here ; 但是我不知道如何从Eclipse触发这个。

    signal signal.signal(signal.SIGINT, my_handler) ),但它可能会更改执行上下文,您可能不希望这样。

        5
  •  -2
  •   Salim Fadhley    17 年前

    如果您已经在调试模式下运行,如果程序执行当前暂停(例如,因为您已经处于断点),则可以设置额外的断点。我刚刚用最新的Pydev试用了一下-效果很好。

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