Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成并要求输入随机生成的密码_Python_Windows_Random_Getpasswd - Fatal编程技术网

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问题,请参阅此处:)