我的程序需要记住已分配给变量的特定预定密码,以便用户输入必须与之匹配。
import random
password = [chr(random.randint(33, 126)) for x in range(6)]
print("Your password is: {}".format(" ".join(password)))
import getpass
pswd = getpass.getpass(password)
if (pswd == password):
print("Access granted")
else:
print("Access denied")
在代码中,他们会收到密码,然后需要输入密码。我删除了大量无关的编码,因此主要是用户获取密码,之后他们必须输入密码。 因此密码是一组随机字符,然后是用户在需要时需要记住和输入的密码。
这不起作用,我想知道是否有人可以帮忙。
另外,有没有办法删除由于GetPassWarning
的输入而在shell上显示的红色文字(getpass.getpass()
)?
感谢。
答案 0 :(得分:2)
将password
设置为加入后获得的字符串,以便将其与用户输入的字符串进行比较。
import random
password = " ".join([chr(random.randint(33, 126)) for x in range(6)])
print("Your password is: {}".format(password)
import getpass
pswd = getpass.getpass("Enter your password: ")
if (pswd == password):
print("Access granted")
else:
print("Access denied")
答案 1 :(得分:1)
而不是:
password = [chr(random.randint(33, 126)) for x in range(6)]
print("Your password is: {}".format(" ".join(password))
...使用:
password = "".join(chr(random.randint(33, 126)) for x in range(6))
print("Your password is: {}".format(password))
因此password
是str
而不是list
。
要防止在密码提示中再次打印密码,并禁止GetPassWarning
(仅在无法解决问题时才需要抑制,如另一篇文章中提到的那样可能与{{1}相关3}}模块),你可以改变:
pswd = getpass.getpass(password)
......来:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore")
pswd = getpass.getpass("Enter password:")
(通过将password
作为第一个参数传递给getpass.getpass
,您当前正在告诉它使用密码本身作为密码提示。)
答案 2 :(得分:0)
这里有几个问题,但你已走上正轨!
试试这个:
import random
import getpass
password = "".join([chr(random.randint(33, 126)) for x in range(6)])
print("Your password is: {}".format(password))
pswd = getpass.getpass("Enter password: ")
if (pswd == password):
print("Access granted")
else:
print("Access denied")
首先,您需要使用"".join()"
而不是" ".join()
,除非您希望在每个字符之间留出空格。其次,您需要在定义"".join()"
时使用password
,因为它需要是一个字符串,相当于您希望用户输入的内容,而不是list
。< / p>
第三,getpass.getpass()
的参数是提示用户输入密码,而不是密码本身。 getpass()
不需要知道密码是什么;它只是帮助您在输入密码时隐藏用户的输入回显。
getpass.getpass([prompt [,stream]])
提示用户输入密码而不回显。使用字符串提示提示用户,默认为“密码:&#39;”。在Unix上,提示符被写入类文件对象流。 stream默认为控制终端(
/dev/tty
)或者如果sys.stderr
不可用(在Windows上忽略此参数)。
修改强>
您看到的红色错误是由于此(来自上面链接的getpass()
手册页):
如果回音免费输入不可用,
getpass()
会回退到打印一条警告消息,以便从sys.stdin
流式传输并发送GetPassWarning
。
这可能是仅限Windows的问题,在Linux / POSIX环境下,输入将被隐藏。
要在Windows下修复此错误,getpass()
会尝试使用msvcrt
模块。我没有要测试的Windows计算机,但尝试在Python提示符或脚本中运行import msvcrt
,看看它是否有效,并发布您在评论中看到的任何错误。如果msvcrt
无法导入,或sys.stdin
未按预期运行,您似乎只会在Windows下出现此错误。
此外,正如@Jasper Bryant-Greene中提到的his answer一样,我们可以使用警告过滤器隐藏警告,如果无法解决msvcrt
的基本问题:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore")
pswd = getpass.getpass("Enter password: ")