1

我的程序需要记住一个特定的预先确定的密码,该密码已分配给一个变量,以便用户输入必须匹配它。

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由于输入而出现在外壳上的红色文字( )getpass.getpass()

谢谢。

4

3 回答 3

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")
于 2016-01-02T19:40:15.170 回答
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是 astr而不是 a list

为了防止再次打印密码作为密码提示的一部分,并禁止GetPassWarning(仅当您无法解决问题时才需要禁止,正如另一篇文章中提到的可能与msvcrt模块有关),您可以更改:

pswd = getpass.getpass(password)

… 到:

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    pswd = getpass.getpass("Enter password:")

(通过password作为第一个参数传递给getpass.getpass,您当前是在告诉它使用密码本身作为密码提示。)

于 2016-01-02T19:42:04.533 回答
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.

第三,参数 forgetpass.getpass()是要求用户输入密码的提示,而不是密码本身。getpass()不需要知道密码是什么;它只是帮助您在用户输入密码时隐藏输入回显。

getpass.getpass([提示[,流]])

提示用户输入密码而不回显。使用字符串提示符提示用户,默认为“密码:”。在 Unix 上,提示被写入类文件对象流。stream 默认为控制终端 ( /dev/tty) 或者如果它不可用sys.stderr(此参数在 Windows 上被忽略)。

编辑

您看到的红色错误是因为这个(来自getpass()上面链接的手册页):

如果无回显输入不可用,则getpass()回退到打印警告消息以流式传输并读取sys.stdin和发出GetPassWarning.

这很可能是 Windows 独有的问题,在 Linux / POSIX 环境下,输入将被隐藏。

要在 Windows 下修复此错误,getpass()请尝试使用该msvcrt模块。我没有要测试的 Windows 机器,但尝试import msvcrt在 Python 提示符或脚本中运行,看看它是否有效,并在评论中发布您看到的任何错误。看起来只有在msvcrt导入失败或sys.stdin未按预期运行时,您才会在 Windows 下收到此错误。

此外,正如@Jasper Bryant-Greene他的回答msvcrt中所建议的那样,如果无法修复潜在问题,我们可以使用警告过滤器来隐藏警告:

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    pswd = getpass.getpass("Enter password: ")
于 2016-01-02T19:42:01.513 回答