背景:項目組每周的例會中,有一項固定內容就是技術分享,可以是與工作相關或無關的任何技術主題。進行技術分享講解的同學是隨機抽簽的。由此做了一個Python的小腳本用於抽取姓名。
腳本內容如下:
#!/usr/bin/python import os import sys import tty, termios import random name_list = ["member_1","member_2","member_3"] input = '' fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(fd) while 'q' != input: sys.stdout.write(random.choice(name_list) + "\r\n") input = sys.stdin.read(1) finally: termios.tcgetattr(fd, termios.TCSADRAIN, old_settings)
代碼說明:
隨機選擇
$ random.choice從序列中獲取一個隨機元素。
$ 其函數原型為:random.choice(sequence)。參數sequence表示一個有序類型。
$ sequence在python不是一種特定的類型,而是泛指一系列的類型。list, tuple, 字符串都屬於sequence。
文件描述符
$ 獲取底層實現使用請求從操作系統的I / O操作的文件描述符:
fileObject.fileno();
$ 腳本中獲取了標准輸入(終端)的文件描述符,后續用於獲取輸入和向屏幕輸出。其實讀取標准輸入的話,我更喜歡用raw_input()這個函數,不過反正都實現了。輸入的時候使用了sys.stdout.write()的原因是,在通過termios改變了終端的屬性后,使用print輸出時格式會發生變化——如果抽取多次,則每次輸出的名字都會在前次輸出的下一行並后延一個tab的位置,造成錯位,不知道為什么。采用了sys.stdout.write()后就正常了。
Termios與tty模塊
$ (只能在Unix及其派生的系統中使用)這兩個模塊配合是為了實現程序實時響應用戶的鍵盤輸入。運行程序時,輸入‘q'則直接退出程序,而不需要按下回車。
$ 首先獲取當前終端配置
old_settings = termios.tcgetattr(fd)
$ 設置終端為非阻塞的輸入方式,按字符響應鍵盤輸入
tty.setraw(fd)
$ 還原終端配置
termios.tcgetattr(fd, termios.TCSADRAIN, old_settings)