如何修改嵌入式IPython shell提示符或在返回新提示符前执行自定义函数
嵌入式IPython调试器定制实现
两个需求均可通过IPython原生扩展能力实现,无需修改框架源码,具体方案如下:
自定义Shell提示符
IPython原生支持全自定义输入、输出提示符格式,继承内置Prompts类即可实现任意样式的提示符,支持静态文本、执行计数,也可根据程序运行状态动态生成提示符内容。
实现代码:
from IPython.terminal.prompts import Prompts, Token from IPython import embed class DebuggerPrompts(Prompts): # 定义输入提示符格式 def in_prompt_tokens(self, cli=None): return [ (Token.Prompt, "dbg ["), (Token.PromptNum, str(self.shell.execution_count)), (Token.Prompt, "] > "), ] # 如需自定义输出提示符(默认格式为Out[1]:),重写该方法即可 # def out_prompt_tokens(self, cli=None): # return [ # (Token.OutPrompt, "ret["), # (Token.OutPromptNum, str(self.shell.execution_count)), # (Token.OutPrompt, "] = "), # ]
启动嵌入式Shell时传入自定义提示符类即可生效:embed(prompts=DebuggerPrompts)
提示符打印前触发自定义状态输出
IPython内置事件钩子体系中,pre_prompt_hook的触发时机恰好是每次用户代码执行完成、准备打印新的输入提示符等待输入的节点,完全匹配需求。绑定自定义函数到该钩子后,每次回到输入等待状态都会自动执行函数,打印你需要的内部状态信息。
实现代码:
from IPython.terminal.interactiveshell import TerminalInteractiveShell from IPython import embed # 自定义状态输出逻辑 def render_debug_state(shell): # 通过shell.user_ns可直接访问嵌入式Shell的命名空间,读取程序内部所有变量 current_bp = shell.user_ns.get("active_breakpoint", "无") call_stack_depth = shell.user_ns.get("call_stack_depth", 0) print(f"[状态] 活动断点: {current_bp} | 调用栈深度: {call_stack_depth}") # 初始化Shell实例并绑定事件 shell = TerminalInteractiveShell.instance() shell.events.register("pre_prompt_hook", render_debug_state) # 启动Shell,同时加载自定义提示符 embed(shell=shell, prompts=DebuggerPrompts)
补充说明
- 绑定的钩子函数接收当前Shell实例作为入参,除打印状态外,也可在钩子中动态调整命名空间、注入调试变量、修改提示符逻辑等。
- 如果需要根据实时状态动态变更提示符内容,无需额外绑定钩子,直接在
DebuggerPrompts类的生成方法中读取程序状态返回对应Token即可。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

