来源: [Python] 控制台输入密码的方法

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. msvcrt.getch() :


python input密文输入 python密码输入简单_python



python input密文输入 python密码输入简单_密码输入_02

代码


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 
   ' 
   )  
   # 
    删除一个星号,但是不知道为什么不能执行... 
   
 
            
   else 
   :
             chars.append(newChar)
             sys.stdout.write( 
   ' 
   * 
   ' 
   ) # 显示为星号
      
   print 
     
   '' 
   .join(chars)

 pwd  
   = 
    pwd_input()
 
   print 
    pwd

 
   # 
    ****** 
   
 # 
    aaaaaa



python input密文输入 python密码输入简单_python


Note:

          但控制台却没有显示相应的退格,比如,当前输入是:abcd,显示为:****,然后现在打一个退格键,实际

 sys.stdout.write('\b') 这行没有执行,估计是和使用

          msvcrt.getch()有关系,如果有人知道为啥请回复一下,3Q~

#########################################################################

我改了原作者的代码(可以同步删除*号了):

#!/usr/bin/python
#coding=utf-8

import msvcrt, sys

def pwd_input(message):
    print message,
    chars = []
    while True:
        newChar = msvcrt.getch()
        if newChar in '\r\n': # 如果是换行,则输入结束
            print ''
            break
        elif newChar == '\b': # 如果是退格,则删除末尾一位
            if chars:
                del chars[-1]
                msvcrt.putch('\b') # 控制台回退一格
                msvcrt.putch(' ') # 打印空格替换掉*
                msvcrt.putch('\b') # <span style="font-family: Arial, Helvetica, sans-serif;">控制台回退一格</span>
        else:
            chars.append(newChar)
            sys.stdout.write('*') # 显示为星号
    return ''.join(chars)

pwd = pwd_input('password:')
print pwd