如何将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
相关产品推荐
相关产品推荐

