Python 生成并要求输入随机生成的密码
我的程序需要记住已分配给变量的特定预定义密码,以便用户输入必须与之匹配Python 生成并要求输入随机生成的密码,python,windows,random,getpasswd,Python,Windows,Random,Getpasswd,我的程序需要记住已分配给变量的特定预定义密码,以便用户输入必须与之匹配 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): prin
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")
在代码中,他们接收密码,然后需要输入密码。我已经删除了大量不相关的编码,因此主要的问题是用户获得了密码,然后他们必须输入密码。
因此,密码是一组随机字符,然后是用户需要记住并在需要时输入的密码
它不起作用了,我想知道是否有人能帮忙
另外,是否有办法删除由于导入getpass.getpass()
)而在shell上显示的红色文字(GetPassWarning
谢谢。将
密码设置为加入后获得的字符串,以便与用户输入的字符串进行比较
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")
这里有几个问题,但你走对了
试试这个:
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()“
,因为它需要是一个字符串,相当于您希望用户输入的内容,而不是列表
第三,参数是提示用户输入密码,而不是密码本身getpass()
不需要知道密码是什么;它只是帮助您在用户输入密码时隐藏用户的输入回音
getpass.getpass([prompt[,stream]])
提示用户输入密码而不回显。将使用字符串提示符提示用户,该提示符默认为“Password:”。在Unix上,提示符像对象流一样写入文件。流默认为控制终端(/dev/tty
),或者如果该终端对sys.stderr
不可用(此参数在Windows上被忽略)
编辑
您看到的红色错误是因为(从上面链接的getpass()
manual页面):
如果无回声输入不可用getpass()
则返回到打印警告消息到流,并从sys.stdin
读取,并发出GetPassWarning
这可能是Windows特有的问题,在Linux/POSIX环境下,输入将被隐藏
要在Windows下修复此错误,getpass()
尝试使用该模块。我没有Windows机器可供测试,但请尝试在Python提示符或脚本中运行import msvcrt
,查看它是否正常工作或失败,并在注释中发布您看到的任何错误。看起来只有在msvcrt
导入失败,或者sys.stdin
未按预期运行时,您才会在Windows下遇到此错误
此外,正如中令人惊叹的建议,如果msvcrt
的根本问题无法解决,我们可以使用警告过滤器来隐藏警告:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore")
pswd = getpass.getpass("Enter password: ")
而不是:
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
而不是一个列表
要防止再次打印密码作为密码提示的一部分,并抑制GetPassWarning
(只有在无法解决问题时才需要抑制,正如另一篇文章中提到的可能与模块相关),您可以更改:
pswd = getpass.getpass(password)
…致:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore")
pswd = getpass.getpass("Enter password:")
(通过将password
作为getpass.getpass
的第一个参数传递,您当前正在告诉它使用密码本身作为密码提示。)password
是一个列表,而不是您打印的字符串。它是否需要是一个字符串才能工作?是,因为pswd
是一个字符串。将字符串与列表进行比较是行不通的。我只是被shell上的输出搞糊涂了。它根据需要打印密码,但作为整个getpass的一部分,它会再次打印密码,但我希望用户输入密码它正在打印.join()
的结果。但这不是password
中的内容。getpass
的参数是提示符。因此,它正在打印保存的密码。如果您有空闲时间,请查看。这是输出例如:您的密码是:`r W[3 N警告(来自警告模块):文件“C:\Python33\lib\getpass.py”,第92行返回回退\u getpass(提示,流)GetPassWarning:无法控制终端上的回显。警告:可能会回显密码输入。`r W[3 N访问拒绝提示catch_warnings()
;我在文章末尾添加了一条关于它的注释,并向您表示感谢!:)谢谢。这很有效,谢谢!但是外壳上出现的红色文字也会出现同样的问题。您的密码是:gG)Xs]Warning(来自警告模块):文件“C:\Python33\lib\getpass.py”,第92行return fallback_getpass(提示符,stream)GetPassWarning:无法控制终端上的回显。警告:可能会回显密码输入。请输入密码:gG)Xs]Access granted上面显示的是从警告开始的红色位。我刚刚添加了有关此错误的说明。当getpass()
无法更改终端回显时会发生这种情况,这似乎是您遇到的Windows特定问题。根本没有问题。还添加了一些更多信息。如果有人想阅读我所看到的内容以了解Windows问题,请参阅此处:)