Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2887064
  • 博文数量: 348
  • 博客积分: 2907
  • 博客等级: 中校
  • 技术积分: 2272
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-12 09:16
个人简介

专注 K8S研究

文章分类

全部博文(348)

文章存档

2019年(22)

2018年(57)

2016年(2)

2015年(27)

2014年(33)

2013年(190)

2011年(3)

2010年(14)

分类: Python/Ruby

2013-06-29 23:05:42

[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": 

      print 

      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)的话,可以取消先前的输入。

 

 

阅读(1758) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~