You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10下如何用Python自动输入getpass.getpass()的密码?

解决Windows下subprocess无法给getpass自动输入密码的问题

问题根源:getpass.getpass()不读取标准输入(stdin),它会绕过stdin直接与系统终端/控制台交互,所以你用subprocess.PIPE向stdin写入内容完全无效。

下面是几种可行的解决方法:

方法1:修改目标脚本(最可靠,优先选择)

如果可以修改1.py,添加参数支持从命令行或环境变量读取密码,绕过getpass的终端交互:

# 修改后的1.py
import getpass
import sys
import os

def main():
    # 优先从命令行参数取密码
    if len(sys.argv) > 1:
        password = sys.argv[1]
    # 其次从环境变量取
    elif "APP_PASSWORD" in os.environ:
        password = os.environ["APP_PASSWORD"]
    # 最后用原有的getpass交互
    else:
        password = getpass.getpass("Enter password: ")
    print(f"Received password: {password}")

if __name__ == "__main__":
    main()

调用时直接传密码参数:

import subprocess

result = subprocess.run(
    ["py", "1.py", "your_secure_password"],
    capture_output=True,
    text=True
)
print(result.stdout)

或者用环境变量传递(更安全,避免密码出现在进程列表):

import subprocess
import os

env = os.environ.copy()
env["APP_PASSWORD"] = "your_secure_password"

result = subprocess.run(
    ["py", "1.py"],
    env=env,
    capture_output=True,
    text=True
)
print(result.stdout)

方法2:用pexpect模拟终端交互(无法修改目标脚本时使用)

pexpect库可以创建伪终端,直接与子进程的终端交互,适合无法修改1.py的场景。

首先安装依赖:

pip install pexpect

然后编写调用代码:

import pexpect

# 启动子进程并创建伪终端
child = pexpect.spawn("py 1.py", encoding="utf-8")
# 等待getpass的提示(根据你的1.py实际提示文本调整,比如"Password: ")
child.expect("Password: ")
# 发送密码并回车
child.sendline("your_secure_password")
# 获取输出内容
output = child.read()
print(output)
# 关闭子进程
child.close()

方法3:Windows键盘模拟(极端场景下使用)

如果以上方法都不适用,可以用pywin32库模拟键盘输入,直接向控制台窗口输入密码:

首先安装依赖:

pip install pywin32

调用代码:

import subprocess
import time
import win32api
import win32con

# 启动子进程,必须显示控制台窗口(不能用stdout=PIPE)
proc = subprocess.Popen(["py", "1.py"])
# 等待程序加载到输入密码的步骤(时间根据实际情况调整)
time.sleep(1)

# 模拟输入密码
password = "your_secure_password"
for char in password:
    # 处理大写字母,需要按住Shift
    if char.isupper():
        win32api.keybd_event(win32con.VK_SHIFT, 0, 0, 0)
    # 按下字符键
    win32api.keybd_event(ord(char.upper()), 0, 0, 0)
    win32api.keybd_event(ord(char.upper()), 0, win32con.KEYEVENTF_KEYUP, 0)
    # 松开Shift(如果之前按下)
    if char.isupper():
        win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_KEYUP, 0)

# 模拟回车提交密码
win32api.keybd_event(win32con.VK_RETURN, 0, 0, 0)
win32api.keybd_event(win32con.VK_RETURN, 0, win32con.KEYEVENTF_KEYUP, 0)

# 等待子进程结束
proc.wait()

注意:这种方法需要目标程序的控制台窗口处于前台,否则输入会发送到当前激活的窗口,可靠性较低,仅作为最后备选。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:25:31