You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中getpass函数无法隐藏终端密码输入字符的问题排查

解决Python getpass模块无法隐藏密码输入的问题

看起来你遇到的这个问题挺常见的,尤其是在IDE或者非原生终端环境下。先给你拆解下原因和对应的解决办法:

为什么会出现这个问题?

getpass模块的工作原理是依赖终端的tty无回显模式:它会临时修改终端的设置,让输入的字符不显示在屏幕上。但像IDLE、PyCharm的内置Shell(包括你测试的Mac系统Python Shell,大概率也是IDLE的交互环境),它们并不是标准的原生终端——这些环境的输入输出逻辑是被IDE封装过的,getpass没法正确修改终端的回显设置,所以就会弹出Warning: Password input may be echoed.的警告,同时密码明文显示。

解决办法

  • 使用原生终端运行代码
    直接打开Mac自带的「终端」(Terminal.app)或者iTerm2,在里面运行你的Python脚本或者进入Python交互环境,getpass就能正常隐藏密码输入了。比如在终端里输入:

    python3
    

    然后再执行:

    import getpass
    a = getpass.getpass(prompt='Password')
    

    这时候输入密码就不会显示出来了。

  • 如果必须在IDE里使用
    要是你离不开PyCharm这类IDE,可以试试用IDE的「终端」面板(不是Python Console)——PyCharm底部的Terminal面板其实是调用了系统原生终端,在这个面板里运行代码,getpass也能正常工作。

    另外,也可以考虑用IDE提供的输入对话框替代,但这种方式不跨平台,比如在PyCharm里可以借助tkinter弹出密码输入框:

    import tkinter as tk
    from tkinter import simpledialog
    
    root = tk.Tk()
    root.withdraw()  # 隐藏主窗口
    password = simpledialog.askstring("Password", "Enter your password:", show='*')
    

    不过这个方法只适合GUI场景,不如原生终端的方案通用。

总的来说,最靠谱的还是回到原生终端环境使用getpass,毕竟这是它设计时的目标环境。

内容的提问来源于stack exchange,提问作者guyd

火山引擎 最新活动