在程序中途进入Python交互式会话?

13 投票
5 回答
3280 浏览
提问于 2025-04-15 11:55

嘿,我在想……我正在用Eclipse里的pydev,真的很喜欢它强大的调试功能,但我想知道:

在Eclipse中设置一个断点,然后在执行过程中跳入交互式Python解释器,这可能吗?

我觉得这会很方便;)

补充说明:我想强调的是,我的目标不是进入调试器。pydev和Eclipse有很棒的调试器,我可以查看错误追踪并设置断点。

我想要的是执行一个脚本,然后在执行过程中跳入交互式Python解释器,这样我就可以做一些事情,比如……

  • 随便看看
  • 检查一些值
  • 修改变量
  • 在把代码加到应用之前先弄明白一些东西

我知道你可以用调试器做到这些,但在交互式解释器里我可以更快,因为我可以试试某个方法,看到不行了,再试别的,而不需要把应用重新运行到执行那段代码的地方。

5 个回答

4

我一直在我的 sitecustomize.py 文件里用这段代码来在出现错误时启动调试器。按下 Ctrl+C 也可以触发这个功能。在命令行里效果很好,不知道在 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 上的更多讨论

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路径中,你可以在代码的任何地方插入以下几行代码,以便进入调试器(只要你是从命令行执行的):

import my_debug
my_debug.db()
9

大约在提问者提出问题一年后,PyDev已经内置了这个功能。我不太确定这个功能是什么时候加入的,但我知道我花了大约两个小时在网上查资料,配置iPython等等(看起来这些方法也能解决问题),结果才意识到Eclipse/PyDev其实已经自带了我想要的功能。

当你在调试模式下遇到断点时,控制台会立刻出现,随时准备好!我之前没注意到这一点,因为没有提示或者闪烁的光标;我错误地以为它只是一个标准的输出控制台……其实不是。它甚至还有代码补全的功能。

真不错,想了解更多细节可以查看 http://pydev.org/manual_adv_debug_console.html

撰写回答