如何确保Dialog.progressbox()持续输出?

0 投票
2 回答
739 浏览
提问于 2025-04-18 01:09

pythondialog 是一个模块,可以让你在类似于 ncurses 的界面中打印信息。我想使用 Dialog.progressbox() 方法来显示来自 subprocess.Popen() 命令的输出。

我遇到的问题是,progressbox() 只会打印已经存在于 /tmp/TemporaryDialogFile 文件中的内容。它不会打印这个文件中新写入的内容。

我想知道如何让 progressbox() 不断显示来自 youtube-dl 的不断增长的输出流。这应该是可行的:文档 也这么说。

相关代码:

def openDialog():
    d = Dialog(dialog="dialog")
    d.set_background_title("Random title")

    w = os.open("/tmp/TemporaryDialogFile", os.O_RDWR|os.O_CREAT)

    os.chdir("/tmp")    
    p = subprocess.Popen(["youtube-dl", "-citw", channel_url], stdout=w, universal_newlines=True)
    d.progressbox(file_path="/tmp/TemporaryDialogFile", text="youtube-dl output:")

progressbox 这就是它应该呈现的样子

2 个回答

0

我这个答案主要是参考了J.F. Sebastian的,所以他的答案被认为是最正确的。我对它做了一些小修改,才让它能正常工作。下面是我的内容:

def openDialog():
    d = Dialog(dialog="dialog")
    d.set_background_title("Random title")

    w = os.open("/tmp/TemporaryDialogFile", os.O_RDWR|os.O_CREAT)

    os.chdir("/tmp")    
    p = subprocess.Popen(["youtube-dl", "-citw", channel_url], bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    d.progressbox(fd=p.stdout.fileno(), text="youtube-dl output:")
1

这可能是一个缓冲问题。Dialog 在子进程(youtube-dl)清空它的输出缓冲区之前,无法显示任何内容。下面的代码可以解决这个问题:

#!/usr/bin/env python3
import sys
from subprocess import Popen, PIPE, STDOUT
from dialog import Dialog # $ pip install pythondialog

d = Dialog(dialog="dialog")
d.set_background_title("Random title")
with Popen([sys.executable or "python", "-u", "-c", r"""import sys, time

for i in range(100):
    print(i)
    if i % 10 == 0:
        sys.stderr.write('.\n')
    time.sleep(.1)
"""], stdout=PIPE, stderr=STDOUT, bufsize=0) as p:
    d.progressbox(fd=p.stdout.fileno(), text="youtube-dl output:")

bufsize=0 是用来关闭 Python(父进程)那边的缓冲。-u 则是让子进程的输出流不进行缓冲(在 Python 3 中是按行缓冲)。

撰写回答