当前位置: 首页 > 知识库问答 >
问题:

使用IPython作为有效的调试器

茅和玉
2023-03-14

如何在代码中嵌入IPython shell,并让它自动显示调用它的行号和函数?

我目前有以下设置可以在代码中嵌入IPython shell:

from IPython.frontend.terminal.embed import InteractiveShellEmbed
from IPython.config.loader import Config

# Configure the prompt so that I know I am in a nested (embedded) shell
cfg = Config()
prompt_config = cfg.PromptManager
prompt_config.in_template = 'N.In <\\#>: '
prompt_config.in2_template = '   .\\D.: '
prompt_config.out_template = 'N.Out<\\#>: '

# Messages displayed when I drop into and exit the shell.
banner_msg = ("\n**Nested Interpreter:\n"
"Hit Ctrl-D to exit interpreter and continue program.\n"
"Note that if you use %kill_embedded, you can fully deactivate\n"
"This embedded instance so it will never turn on again")   
exit_msg = '**Leaving Nested interpreter'

# Put ipshell() anywhere in your code where you want it to open.
ipshell = InteractiveShellEmbed(config=cfg, banner1=banner_msg, exit_msg=exit_msg)

这允许我只需使用ipshell()就可以在代码的任何地方启动完整的IPython shell。例如,以下代码:

a = 2
b = a
ipshell()
frameinfo = getframeinfo(currentframe())
print 'Stopped at: ' + frameinfo.filename + ' ' +  str(frameinfo.lineno)

共有1个答案

方砚
2023-03-14

您可以从另一个用户定义函数中调用ipshell(),例如ipsh()

from inspect import currentframe

def ipsh():
    frame = currentframe().f_back
    msg = 'Stopped at {0.f_code.co_filename} and line {0.f_lineno}'.format(frame)
    ipshell(msg,stack_depth=2) # Go back one level!

然后,只要您想放入IPython shell,就使用ipsh()

  • stack_depth=2在检索新的IPython shell的命名空间时要求ipshell上升一个级别(默认值为1)。
  • currentframe().f_back()检索前一个框架,以便打印调用ipsh()的位置的行号和文件。
 类似资料:
  • 从我所读到的内容来看,Python中有两种调试代码的方法: > 使用传统调试器,如或。它支持诸如用于、用于、用于等命令,但是您不能直接访问IPython shell,这对于对象检查非常有用。 通过在代码中嵌入IPython shell来使用IPython。您可以从IPython导入嵌入,然后在代码中使用。当您的程序/脚本命中语句时,您将被放到IPython shell中。这允许使用IPython的

  • 问题内容: 根据我的阅读,有两种方法可以在Python中调试代码: 使用传统的调试器,例如或。它支持诸如for ,for ,for等命令,但是您没有直接访问IPython shell的权限,这对于对象检查非常有用。 使用 IPython的 通过嵌入代码中的一个IPython的壳。您可以这样做,然后在您的代码中使用。当您的程序/脚本命中一条语句时,您将进入IPython shell。这允许使用所有I

  • 当调用为时,可以执行,打开带有文件的默认编辑器。我想使用“两个进程”模型,以便我可以将多个客户端附加到同一个内核。但这似乎不允许打开编辑器。是设计好的吗?有解决方法吗?

  • 我需要在文件中创建一个图形,而不在IPython笔记本中显示它。我不清楚和。但是,当我调用除了保存在。当自动创建大型打印文件集时,这通常是不可取的。或者在需要另一个应用程序进行外部处理的中间文件的情况下。 不确定这是一个还是笔记本问题。

  • 问题内容: 假设我有一个IPython会话,从中调用一些脚本: 有没有一种方法可以引入断点,从中可以从IPython检查工作区? 我记得在以前的IPython版本中可以做到这一点: 但是该子模块似乎不再可用。 假设我已经打开了IPython会话: 如何在我选择的位置停止程序并使用IPython检查我的工作区 ? 通常,我更喜欢不需要我预先指定行号的解决方案,因为我希望上面有多个这样的调用,而不必跟

  • 问题内容: 为什么可以用经node.js测试的JavaScript调用此函数: 为什么最后一次呼叫“” 有效?是node.js中的错误,V8引擎中的错误,正式未定义的行为还是对所有解释程序实际上有效的JavaScript? 问题答案: 似乎是Node REPL错误,将这两行放在会导致语法错误。 错误: 问题已提交#6634。 转载于v0.10.20。 v0.11.7已修复此问题。