全部博文(298)
分类: Python/Ruby
2012-03-15 09:37:39
[Python] 控制台输入密码的方法
部分转自:http://www.cnblogs.com/lovebread/archive/2010/11/09/1872774.html 有修改
部分转自:http://blog.csdn.net/cherylnatsu/article/details/6574060 有修改
1. raw_input() :
pwd = raw_input('password: ')
print pwd
# password: aaa
# aaa
Note: 最简单的方法,但是不安全
2. getpass.getpass() :
import getpass
pwd = getpass.getpass('password: ')
print pwd
# password:
# aaaa
Note: 很安全,但是看不到输入的位数,会让人觉得有点不习惯,不知道的还以为没有在输入..
3. termios:
#! /usr/bin/env python
import sys, tty, termios
def getch():
fd = sys.stdin.fileno()
old_settings = .tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def getpass(maskchar = "*"):
password = ""
while True:
ch = getch()
if ch == "\r" or ch == "\n":
return password
elif ch == "\b" or ord(ch) == 127:
if len(password) > 0:
sys.stdout.write("\b \b")
password = password[:-1]
else:
if maskchar != None:
sys.stdout.write(maskchar)
password += ch
if __name__ == "__main__":
print "Enter password:",
password = getpass("*")
print password
4. msvcrt.getch() :
import msvcrt, sys
def pwd_input():
chars = []
while True:
newChar = msvcrt.getch()
if newChar in '\r\n': # 如果是换行,则输入结束
print ''
break
elif newChar == '\b': # 如果是退格,则删除末尾一位
if chars:
del chars[-1]
sys.stdout.write('\b \b') # 删除一个星号
else:
chars.append(newChar)
sys.stdout.write('*') # 显示为星号
print ''.join(chars)
pwd = pwd_input()
print pwd
# ******
# aaaaaa
Note: 我自己的电脑无法找到msvcrt模块,这个方案仅仅供参考,解决了第二种方法不能显示输入位数的问题,如果按退格键(backspace)的话,可以取消先前的输入。