如何确保我的Dialog.progressbox()不断提供输出?

时间:2014-04-03 11:05:50

标签: python dialog subprocess data-stream python-curses

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

我面临的问题是progressbox()只会打印/tmp/TemporaryDialogFile中已有的内容。它不会打印写入此文件的新内容。

我想知道如何让progressbox()继续显示来自youtube-dl的不断增长的输出流。这应该是可能的:the documentation这样说。

相关代码:

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 :(得分:1)

这可能是一个缓冲问题。在子进程(Dialog)刷新其stdout / stderr缓冲区之前,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上进行行缓冲)。

答案 1 :(得分: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:")