当从IDLE运行时,出现“GetPassWarning:无法在终端上控制回显”。

14

当我运行这段代码时:

import getpass

p = getpass.getpass(prompt='digite a senha\n')
if p == '12345':
    print('YO Paul')
else:
    print('BRHHH')
print('O seu input foi:', p) # p = seu input

我收到了这个警告:

Warning (from warnings module):
   File "/usr/lib/python3.4/getpass.py", line 63
    passwd = fallback_getpass(prompt, stream)
GetPassWarning: Can not control echo on the terminal. Warning: Password input may be echoed.

1
这将取决于系统和终端:https://docs.python.org/2/library/getpass.html 提示用户输入密码时不回显。如果无法获得无回显输入,则getpass()会退回到向流打印警告消息并从sys.stdin读取,并发出GetPassWarning。 - handle
5
我认为警告准确地告诉你,没有一种方法(Python 知道或识别的),可以防止密码在发出消息的系统上被回显。 - John Bollinger
1
我正在使用IDLE:Python 3.4.3(默认,2015年10月14日,20:28:29) [GCC 4.8.4]在Linux上。 - Paul Sigonoso
1
getpass的工作原理:https://dev59.com/02445IYBdhLWcg3w9Oss - handle
1
注意:如果您在IDLE中调用getpass,则输入可能会在启动IDLE的终端中完成,而不是在idle窗口本身中完成。 - handle
5
IDLE会干扰正常的控制台输入输出;getpass并不适合在这种环境中使用。 - PM 2Ring
4个回答

15

使用实际的终端——即连接到/dev/tty或其他PTY兼容设备的环境,其中stdinstdoutstderr已连接。

IDLE REPL不符合此要求。


5

在终端中运行你的代码,而不是在集成开发环境(IDE)中。你会发现那里不再有警告。 要运行你的代码,请在终端中输入以下命令:

python3 your_program.py

2

如果不想在未启动Python的终端中更改当前工作目录(这意味着您需要键入类似于python3 script.py的内容--并且它将失败,除非已经指定了当前工作目录),请在终端中启动Python并运行此单行命令:

exec(open('C:\folder\script.py').read())

在其中,您需要更改路径字符串'C:\folder\script.py'以匹配文件在磁盘上的位置(该字符串确实需要用引号括起来)。


这将消除警告。话虽如此,它也不提供有关您输入了多少个字符、按了多少个退格键等任何反馈,因此如果您的密码很长,那么使用该包,getpass.getpass(prompt='Securely enter your password (minimum of xx characters): ')就是你能得到的最好的选择。 - brethvoice

1

请使用命令提示符(cmd),然后在其中运行该文件。

例如:

python abc.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接