如何确保Dialog.progressbox()持续输出?
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:")
这就是它应该呈现的样子
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 中是按行缓冲)。