在程序中途进入Python交互式会话?
嘿,我在想……我正在用Eclipse里的pydev,真的很喜欢它强大的调试功能,但我想知道:
在Eclipse中设置一个断点,然后在执行过程中跳入交互式Python解释器,这可能吗?
我觉得这会很方便;)
补充说明:我想强调的是,我的目标不是进入调试器。pydev和Eclipse有很棒的调试器,我可以查看错误追踪并设置断点。
我想要的是执行一个脚本,然后在执行过程中跳入交互式Python解释器,这样我就可以做一些事情,比如……
- 随便看看
- 检查一些值
- 修改变量
- 在把代码加到应用之前先弄明白一些东西
我知道你可以用调试器做到这些,但在交互式解释器里我可以更快,因为我可以试试某个方法,看到不行了,再试别的,而不需要把应用重新运行到执行那段代码的地方。
5 个回答
我一直在我的 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 上的更多讨论。
这是来自一个旧项目的内容,我不是作者,但它做的事情和你想要的类似,使用了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()
大约在提问者提出问题一年后,PyDev已经内置了这个功能。我不太确定这个功能是什么时候加入的,但我知道我花了大约两个小时在网上查资料,配置iPython等等(看起来这些方法也能解决问题),结果才意识到Eclipse/PyDev其实已经自带了我想要的功能。
当你在调试模式下遇到断点时,控制台会立刻出现,随时准备好!我之前没注意到这一点,因为没有提示或者闪烁的光标;我错误地以为它只是一个标准的输出控制台……其实不是。它甚至还有代码补全的功能。
真不错,想了解更多细节可以查看 http://pydev.org/manual_adv_debug_console.html。