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

如何将prompt_toolkit的prompt输出重定向至标准错误流?

将prompt_toolkit的动态输出重定向到stderr

要实现把prompt_toolkit的动态进度条输出到stderr,你可以通过以下几种可靠的方法解决,针对你遇到的问题逐一修正:

方法一:使用PromptSession + 正确创建stderr输出对象(推荐)

prompt()快捷函数不支持直接指定输出流,但PromptSession可以。确保你使用的是最新版prompt_toolkit(避免模块路径兼容问题),先执行pip install --upgrade prompt-toolkit升级,再使用以下代码:

import sys
import time
import numpy as np
from prompt_toolkit import PromptSession
from prompt_toolkit.output import create_output

class YourRecorder:
    def __init__(self):
        self.pct = 0.5  # 示例进度值
        self.threshold = 0.1
        self.start_time = time.time()

    def get_prompt(self):
        num = 10
        cnt = int(self.pct * 10) if not np.isnan(self.pct) and self.pct >= self.threshold else 0
        bar = "#" * cnt + "_" * (num - cnt)
        bar = bar[:num]

        dur = time.time() - self.start_time
        return f"Recording. Press option and ENTER (or just ENTER for default)... {dur:.1f}sec {bar}"

recorder = YourRecorder()
# 创建指向stderr的输出对象
stderr_output = create_output(sys.stderr)
session = PromptSession(output=stderr_output)

# 带动态刷新的prompt
choice = session.prompt(recorder.get_prompt, refresh_interval=0.1)

解决导入错误问题

你之前遇到的ImportError: No module named 'prompt_toolkit.output.vt100'是旧版本prompt_toolkit的路径兼容问题,升级到最新版后,create_output函数会自动根据当前环境适配正确的输出类,无需手动导入vt100相关模块。

方法二:临时重定向stdout到stderr(兼容旧版本)

如果你无法升级prompt_toolkit,可以用上下文管理器临时将stdout重定向到stderr,这种方法不需要修改prompt_toolkit的调用逻辑:

import sys
import time
import numpy as np
from contextlib import redirect_stdout
from prompt_toolkit.shortcuts import prompt

class YourRecorder:
    def __init__(self):
        self.pct = 0.5
        self.threshold = 0.1
        self.start_time = time.time()

    def get_prompt(self):
        num = 10
        cnt = int(self.pct * 10) if not np.isnan(self.pct) and self.pct >= self.threshold else 0
        bar = "#" * cnt + "_" * (num - cnt)
        bar = bar[:num]

        dur = time.time() - self.start_time
        return f"Recording. Press option and ENTER (or just ENTER for default)... {dur:.1f}sec {bar}"

recorder = YourRecorder()

# 临时将stdout重定向到stderr
with redirect_stdout(sys.stderr):
    choice = prompt(recorder.get_prompt, refresh_interval=0.1)

注意:这种方法会把用户输入的内容也输出到stderr,如果你的需求允许这种情况,可以使用。

为什么之前的尝试失败

  • 直接给prompt()传output参数:prompt()是封装好的快捷函数,不支持该参数,必须使用PromptSession来配置输出流。
  • 旧版本的PromptSession导入错误:旧版prompt_toolkit的输出模块路径与新版不同,升级到最新版即可解决兼容问题。

内容的提问来源于stack exchange,提问作者Grzegorz Wierzowiecki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:51:14