termios --- POSIX 風(fēng)格的 tty 控制?


此模塊提供了針對tty I/O 控制的 POSIX 調用的接口。 有關(guān)此類(lèi)調用的完整描述,請參閱 termios(3) Unix 指南頁(yè)。 它僅在當安裝時(shí)配置了支持 POSIX termios 風(fēng)格的 tty I/O 控制的 Unix 版本上可用。

此模塊中的所有函數均接受一個(gè)文件描述符 fd 作為第一個(gè)參數。 這可以是一個(gè)整數形式的文件描述符,例如 sys.stdin.fileno() 所返回的對象,或是一個(gè) file object,例如 sys.stdin 本身。

這個(gè)模塊還定義了與此處所提供的函數一起使用的所有必要的常量;這些常量與它們在 C 中的對應常量同名。 請參考你的系統文檔了解有關(guān)如何使用這些終端控制接口的更多信息。

這個(gè)模塊定義了以下函數:

termios.tcgetattr(fd)?

對于文件描述符 fd 返回一個(gè)包含 tty 屬性的列表,形式如下: [iflag, oflag, cflag, lflag, ispeed, ospeed, cc],其中 cc 為一個(gè)包含 tty 特殊字符的列表(每一項都是長(cháng)度為 1 的字符串,索引號為 VMINVTIME 的項除外,這些字段如有定義則應為整數)。 對旗標和速度以及 cc 數組中索引的解讀必須使用在 termios 模塊中定義的符號常量來(lái)完成。

termios.tcsetattr(fd, when, attributes)?

根據 attributes 列表設置文件描述符 fd 的 tty 屬性,該列表即 tcgetattr() 所返回的對象。 when 參數確定何時(shí)改變屬性: TCSANOW 表示立即改變,TCSADRAIN 表示在傳輸所有隊列輸出后再改變,或 TCSAFLUSH 表示在傳輸所有隊列輸出并丟失所有隊列輸入后再改變。

termios.tcsendbreak(fd, duration)?

在文件描述符 fd 上發(fā)送一個(gè)中斷。 duration 為零表示發(fā)送時(shí)長(cháng)為 0.25--0.5 秒的中斷;duration 非零值的含義取決于具體系統。

termios.tcdrain(fd)?

進(jìn)入等待狀態(tài)直到寫(xiě)入文件描述符 fd 的所有輸出都傳送完畢。

termios.tcflush(fd, queue)?

在文件描述符 fd 上丟棄隊列數據。 queue 選擇器指定哪個(gè)隊列: TCIFLUSH 表示輸入隊列,TCOFLUSH 表示輸出隊列,或 TCIOFLUSH 表示兩個(gè)隊列同時(shí)。

termios.tcflow(fd, action)?

在文件描述符 fd 上掛起一戰恢復輸入或輸出。 action 參數可以為 TCOOFF 表示掛起輸出,TCOON 表示重啟輸出,TCIOFF 表示掛起輸入,或 TCION 表示重啟輸入。

termios.tcgetwinsize(fd)?

Return a tuple (ws_row, ws_col) containing the tty window size for file descriptor fd. Requires termios.TIOCGWINSZ or termios.TIOCGSIZE.

3.11 新版功能.

termios.tcsetwinsize(fd, winsize)?

Set the tty window size for file descriptor fd from winsize, which is a two-item tuple (ws_row, ws_col) like the one returned by tcgetwinsize(). Requires at least one of the pairs (termios.TIOCGWINSZ, termios.TIOCSWINSZ); (termios.TIOCGSIZE, termios.TIOCSSIZE) to be defined.

3.11 新版功能.

參見(jiàn)

模塊 tty

針對常用終端控制操作的便捷函數。

示例?

這個(gè)函數可提示輸入密碼并且關(guān)閉回顯。 請注意其采取的技巧是使用一個(gè)單獨的 tcgetattr() 調用和一個(gè) try ... finally 語(yǔ)句來(lái)確保舊的 tty 屬性無(wú)論在何種情況下都會(huì )被原樣保存:

def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO          # lflags
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd