将 python 输出馈送到 whiptail

Feed python output to whiptail

我想通过将某些 PYTHON 代码的输出传递给 'whiptail',在无头 linux 服务器上使用 TUI(文本用户界面)。不幸的是,鞭尾鱼似乎什么也没发生。当我通过管道从常规 shell 脚本输出时,whiptail 可以正常工作。这是我拥有的:

数据-gen.sh

#!/bin/bash
echo 10
sleep 1
echo 20
sleep 1
...
...
echo 100
sleep 1

$ ./data-gen.sh | whiptail --title "TEST" --gauge "GAUGE" 0 50 0

我看到下面的进度条按预期递增。


现在我尝试从 python 复制同样的东西:

数据-gen.py

#!/usr/bin/python
import time

print 10
time.sleep(1)
...
...
print 100
time.sleep(1)

$ ./data-gen.py | whiptail --title "TEST" --gauge "GAUGE" 0 50 0

我看到下面的进度条停留在 0%。没有看到增量。一旦后台的 python 程序退出,Whiptail 就会退出。

关于如何使 python 输出成功通过管道传输到 whiptail 有什么想法吗?我没有用对话尝试过这个;因为我想坚持使用预装在大多数 ubuntu 发行版上的 whiptail。

man whiptail 说:

--gauge text height width percent

          A gauge box displays a meter along the bottom of the
          box.  The meter indicates a percentage.  New percentages
          are read from standard input, one integer per line.  The
          meter is updated to reflect each new percentage.  If
          stdin is XXX, the first following line is a percentage
          and subsequent lines up to another XXX are used for a
          new prompt.  The gauge exits when EOF is reached on
          stdin.

这意味着 whiptailstandard input 读取。许多程序 通常在不进入文件时缓冲输出。强迫 python 要生成无缓冲输出,您可以:

  • 运行 它与 unbuffer:

    $ unbuffer ./data-gen.py | whiptail --title "TEST" --gauge "GAUGE" 0 50 0
    
  • 在命令行使用-u开关:

    $ python -u ./data-gen.py | whiptail --title "TEST" --gauge "GAUGE" 0 50 0
    
  • 修改data-gen.py的shebang:

    #!/usr/bin/python -u
    import time
    print 10
    time.sleep(1)
    print 20
    time.sleep(1)
    print 100
    time.sleep(1)
    
  • 每次 print:

    后手动刷新标准输出
    #!/usr/bin/python
    import time
    import sys
    
    print 10
    sys.stdout.flush()
    time.sleep(1)
    print 20
    sys.stdout.flush()
    time.sleep(1)
    print 100
    sys.stdout.flush()
    time.sleep(1)
    
  • 设置PYTHONUNBUFFERED环境变量:

    $ PYTHONUNBUFFERED=1 ./data-gen.py | whiptail --title "TEST" --gauge "GAUGE" 0 50 0