如何使python curses应用程序管道友好?

时间:2018-12-09 21:24:36

标签: python stdout pipeline curses

我正在编写一个python应用程序,该应用程序旨在在unix管道内交互使用。该应用程序应启动基于curses的终端UI,并基于用户交互,仅在退出前立即写入标准输出。

典型用法是典型管道:

foo_command | my_application | sink_app

我遇到的问题是,在应用程序运行时,python curses库会将各种东西发送到stdout。此外,sink_app在运行时my_application开始执行。

  • 如何防止诅咒污染标准品?
  • 要刷新输出时如何缓冲输出和控制?
  • 是否可以控制sink_app何时开始执行以及何时停止接受输入?

根据我的收集,我需要保存对stdout文件描述符的引用,以便以后可以对其进行写入。然后将另一个fd(哪个?)传递给ncurses。据说可以通过newterm()实现,但这在python curses绑定中不可用。

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作(在管道中设置curses应用程序),方法是使用newterm功能直接打开用于管理屏幕的终端,同时保留 stdout 用于管道。 dialog程序执行此操作。

但是Python curses界面没有newterm(它只有initscr,它在屏幕上使用 stdout ...),尽管有一些解决方法(在Python中,通过处理I / O流),该论坛上的任何答案都未解决该问题。

答案 1 :(得分:0)

suggested一样,处理输入流。这没有经过很好的测试,但是似乎在正确的轨道上……

import os

# back up the piped stdin
mystdin_fd = os.dup(0)

# open the terminal for reading keyboard events
termin = open("/dev/tty")

# replace stdin with the terminal, so curses initscr() and getch() work
os.dup2(termin.fileno(), 0)

# initialise curses - https://docs.python.org/3/howto/curses.html
...

# read from the piped stdin
mystdin = open(mystdin_fd, 'r')
for line in mystdin:
    ...