getpass模塊
昨天跟學弟吹牛b安利Python標準庫官方文檔的時候偶然發現了這個模塊。仔細一看內容挺少的,只有兩個主要api,就花了點時間閱讀了一下源碼,感覺挺實用的,在這安利給大家。
getpass.getpass(prompt=’Password: ‘, stream=None)
調用該函數可以在命令行窗口裏面無回顯輸入密碼。參數prompt代表提示字符串,默認是’Password: ‘。在Unix系統中,stream默認爲當前控制的終端。在Windows系統裏stream參數會被忽略掉,默認使用stdin。如果無法正常使用getpass,會打印錯誤信息,然後模塊會使用有回顯的模式讀取數據。
>>> import getpass
>>> passwd = getpass.getpass()
Password:
>>> print(passwd)
ganziqim
getpass.getuser()
返回當前用戶名。這個函數會按順序檢查環境變量LOGNAME, USER, LNAME和USERNAME。返回第一個非空的值。如果檢查不到非空的值,模塊會嘗試導入pwd模塊,如果系統支持pwd模塊,會返回通過pwd模塊獲取的用戶名,否則報錯。
>>> getpass.getuser()
'ganzi'
一些細節
getpass模塊內部其實實現了unix_getpass、win_getpass和fallback_getpass三個函數。在模塊被導入之後會首先對用戶使用的系統進行檢查,將相應的函數賦值給getpass。如果檢查失敗,則將fallback_getpass賦值給getpass。
win_getpass使用msvcrt.getwch()獲取無回顯輸入。
fallback_getpass不僅在一開始檢查系統的時候被調用,當另外兩個函數出現錯誤的時候也會調用它。而調用了fallback_getpass又會先打印錯誤信息,然後再調用模塊內部的_raw_input函數進行有回顯的輸入讀取。
這個是寫在模塊底部的系統檢查代碼:
try:
import termios
termios.tcgetattr, termios.tcsetattr
except (ImportError, AttributeError):
try:
import msvcrt
except ImportError:
getpass = fallback_getpass
else:
getpass = win_getpass
else:
getpass = unix_getpass
總結:getpass模塊只有不到200行代碼(包括註釋和模塊文檔),getuser的主要代碼更是隻有短短7行,內部實現非常簡單。但模塊內部有很多處理異常情況的代碼,很多細節沒辦法在博客裏面展開細說,說了顯得囉嗦,不像是筆記。所以建議有興趣的讀者花點時間閱讀一下源碼,能對模塊的細節有更充分的理解。