1

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

数据生成.sh

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

$ ./data-gen.sh | 鞭尾--标题“测试”--计量“仪表”0 50 0

我得到以下进度条按预期递增。

从 shell 脚本管道输出时 Whiptail 工作


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

数据生成.py

#!/usr/bin/python
import time

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

$ ./data-gen.py | 鞭尾--标题“测试”--计量“仪表”0 50 0

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

管道python输出时进度条没有变化

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

4

1 回答 1

1

man whiptail说:

--gauge 文本高度宽度百分比

          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
    
  • 修改 shebang 的data-gen.py

    #!/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
    
于 2017-12-21T12:22:25.763 回答