You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改嵌入式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.05 16:18:28