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:")
这应该是它应该是什么样的
答案 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:")