簡體   English   中英

如何使 python 詛咒應用程序管道友好?

[英]How to I make python curses application pipeline friendly?

我正在編寫一個旨在在 unix 管道內交互使用的 python 應用程序。 應用程序應該啟動一個基於curses 的終端用戶界面,並根據用戶交互,僅在退出前寫入標准輸出。

典型用法是典型管道的用法:

foo_command | my_application | sink_app

我遇到的問題是,當應用程序運行時,python curses 庫將各種內容發送到 stdout。 此外, sink_appmy_application運行時開始執行。

  • 如何防止詛咒污染標准輸出?
  • 當我想刷新它時,如何緩沖輸出和控制?
  • 是否可以控制sink_app開始執行以及何時停止接受輸入?

根據我收集的信息,我需要保存對 stdout 文件描述符的引用,以便以后可以寫入。 並將另一個 fd(哪個?)傳遞給 ncurses。 據說是通過 newterm() 實現的,但這在 python 詛咒綁定上不可用。

您可以通過使用newterm函數直接打開終端來管理屏幕,同時為管道保留標准輸出來執行此操作(在管道中設置一個 curses 應用程序)。 dialog程序執行此操作。

但是 Python curses 接口沒有newterm (它只有initscr ,它在屏幕上使用stdout ......),雖然可能有解決方法(在 Python 中,處理 I/O 流),但尚未解決在本論壇的任何答案中。

按照建議,處理輸入流。 這沒有經過很好的測試,但似乎在正確的軌道上......

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:
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM