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


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

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

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

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

termios.tcgetattr(fd)?

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

termios.tcsetattr(fd, when, attributes)?

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

termios.tcsendbreak(fd, duration)?

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

termios.tcdrain(fd)?

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

termios.tcflush(fd, queue)?

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

termios.tcflow(fd, action)?

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

參見

模塊 tty

針對(duì)常用終端控制操作的便捷函數(shù)。

示例?

這個(gè)函數(shù)可提示輸入密碼并且關(guān)閉回顯。 請(qǐng)注意其采取的技巧是使用一個(gè)單獨(dú)的 tcgetattr() 調(diào)用和一個(gè) try ... finally 語句來確保舊的 tty 屬性無論在何種情況下都會(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