如何将 `prompt_toolkit` `prompt` 输出重定向到标准错误?

问题描述 投票:0回答:1

如何将

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
输出重定向到标准错误?

我尝试过的:

  1. 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
    参数,这意味着我需要另一种方法来自定义输出流。

  2. 切换到

    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
    )在某些环境中会导致兼容性问题,使其不可靠。

python command-line stderr prompt-toolkit python-prompt-toolkit
1个回答
1
投票

答案:

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)

挑战和解决方案说明:

  1. 初始尝试:最初,我直接将

    prompt()
    output=create_output(sys.stderr)
    参数一起使用,但
    prompt()
    不接受
    output
    作为参数。另一种方法是使用
    PromptSession
    ,它支持自定义输出流。

  2. 意外导入:我也尝试使用

    vt100.StderrOutput
    ,但这导致我的环境中出现导入错误。直接使用
    create_output(sys.stderr)
    最终成功了。

  3. 最终解决方案:通过创建一个

    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)
的解决方案有效满足了我的需求。

© www.soinside.com 2019 - 2024. All rights reserved.