0

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:")

进度框 这就是它应该的样子

4

2 回答 2

1

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

于 2014-04-05T09:18:16.143 回答
0

我在很大程度上从 JF Sebastian's 得出了这个答案;这就是为什么这是公认的答案。我不得不对其进行一些修改以使其正常工作。开始:

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:")
于 2014-04-07T22:49:19.297 回答