如何将
prompt_toolkit
输出重定向到标准错误?
我正在使用一个使用
from prompt_toolkit.shortcuts import prompt
的脚本,并且我正在尝试向标准错误而不是标准输出显示进度条。这是我设置的核心:
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}"
choice = prompt(self.get_prompt, refresh_interval=0.1)
使用
prompt
功能时,进度条输出默认为标准输出,这不是我想要的。我尝试指定 sys.stderr
作为输出,但在传递 output=create_output(sys.stderr)
时遇到错误。我还尝试使用 PromptSession
和其他调整,但我不断遇到问题。有没有人成功地将 prompt_toolkit
输出重定向到标准错误?
我尝试过的:
将
prompt()
与 output=create_output(sys.stderr)
一起使用
我最初的方法是直接将
output=create_output(sys.stderr)
传递给 prompt()
函数,希望它能让输出进入标准错误而不是标准输出。代码如下:
import sys
from prompt_toolkit.shortcuts import prompt
from prompt_toolkit.output import create_output
# Attempt to direct output to standard error
stderr_output = create_output(sys.stderr)
def get_prompt():
return "This should appear on stderr."
choice = prompt(get_prompt, output=stderr_output)
结果:这导致了错误:
TypeError: prompt() got an unexpected keyword argument 'output'
解释:我意识到
prompt()
不直接接受output
参数,这意味着我需要另一种方法来自定义输出流。
切换到
PromptSession
接下来,我发现
PromptSession
可以接受output
参数,所以我尝试使用它来代替prompt()
。这就是我所做的:
import sys
from prompt_toolkit import PromptSession
from prompt_toolkit.output import create_output
# Create a PromptSession with output to stderr
stderr_output = create_output(sys.stderr)
session = PromptSession(output=stderr_output)
def get_prompt():
return "Recording to stderr session."
# Using the session to display output to stderr
choice = session.prompt(get_prompt)
结果:这看起来很有希望,但我遇到了另一个问题。我的环境由于
vt100
导入而引发错误,特别是在尝试使用 StderrOutput
时。
ImportError: No module named 'prompt_toolkit.output.vt100'
解释:我意识到
vt100
特定的实现(如StderrOutput
)在某些环境中会导致兼容性问题,使其不可靠。
答案:
将
prompt_toolkit
输出重定向到标准错误的最佳方法是将 PromptSession
与 create_output(sys.stderr)
结合使用。以下是我在导入某些函数时经过一系列尝试和一些挑战后解决该问题的方法。这是对我有用的设置:
from prompt_toolkit import PromptSession
from prompt_toolkit.output import create_output
import sys
import time
import numpy as np
class MyClass:
def __init__(self, pct, threshold):
self.pct = pct
self.threshold = threshold
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}"
# Create an output object that writes to standard error
stderr_output = create_output(sys.stderr)
# Create a PromptSession with the custom output
session = PromptSession(output=stderr_output)
# Example usage
my_instance = MyClass(pct=0.5, threshold=0.3)
choice = session.prompt(my_instance.get_prompt, refresh_interval=0.1)
挑战和解决方案说明:
初始尝试:最初,我直接将
prompt()
与output=create_output(sys.stderr)
参数一起使用,但prompt()
不接受output
作为参数。另一种方法是使用 PromptSession
,它支持自定义输出流。
意外导入:我也尝试使用
vt100.StderrOutput
,但这导致我的环境中出现导入错误。直接使用create_output(sys.stderr)
最终成功了。
最终解决方案:通过创建一个
PromptSession
并将stderr_output
作为自定义输出对象,进度条和其他prompt_toolkit
输出可以重定向到标准错误。
此解决方案保持主提示功能完整,同时将输出定向到标准错误,这对于标准输出需要保持整洁的日志记录或调试场景很有用。您可以在 GitHub 上找到我的工作代码。
最终解决方案:使用 create_output(sys.stderr)
和
PromptSession
遇到这些问题后,我决定简化一下,回到直接使用create_output(sys.stderr)
。这种方法无需
vt100
或任何特定于环境的依赖项即可工作。这是成功将
prompt_toolkit
输出重定向到标准错误的最终代码:
import sys
from prompt_toolkit import PromptSession
from prompt_toolkit.output import create_output
# Create an output object that writes to standard error
stderr_output = create_output(sys.stderr)
# Create a PromptSession with the custom output
session = PromptSession(output=stderr_output)
def get_prompt():
return "Final working solution on stderr."
# Use the session to display output on stderr
choice = session.prompt(get_prompt)
结果:最终方法成功地将输出显示为标准错误,而没有额外的导入错误。
我的期望:
我正在寻找一种使用prompt_toolkit
将输出显示为标准错误而不是标准输出的方法,这对于日志记录和调试场景特别有用。最初,我希望直接将
sys.stderr
设置为
prompt()
内的输出目标,但最终使用
PromptSession
和
create_output(sys.stderr)
的解决方案有效满足了我的需求。