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

subprocess.run执行docker login输出为空,密码错误时无法捕获报错如何解决

解决方案

问题根因

  • 正确登录时op.stdout为None:你配置了stdout=sys.stdout,docker命令的标准输出会直接打印到当前脚本的控制台,不会缓存到返回对象的stdout属性中,因此无法通过op.stdout读取内容。
  • 错误密码时无法捕获报错:你开启了check=True参数,docker命令返回非0状态码时会直接抛出subprocess.CalledProcessError异常,代码不会执行后续打印op.stderr的逻辑,报错信息存储在异常对象的属性中,你之前的全局捕获没有提取该内容。

修复后代码

import subprocess
import sys
import traceback

try:
    op = subprocess.run(
        ['docker', 'login', '-u', 'username', '-p', 'password', 'dockerhub.com'],
        check=True,
        stdout=subprocess.PIPE, # 缓存标准输出到返回对象
        stderr=subprocess.PIPE,
        text=True # 直接返回字符串类型输出,无需手动decode,Python 3.7+支持
    )
    # 手动打印标准输出到控制台,和之前的表现一致
    print(op.stdout.strip())
    print("Docker stdout :", op.stdout.strip())
except subprocess.CalledProcessError as e:
    # 从异常对象中提取错误信息
    print("Docker Error :", e.stderr.strip())
except Exception:
    traceback.print_exc()

可选调整说明

  • 如果你不需要保存标准输出内容,仅需要打印到控制台,可以把stdout=subprocess.PIPE改回stdout=sys.stdout,不影响异常时错误信息的捕获。
  • 低版本Python(3.6及以下)可以把text=True替换为universal_newlines=True,效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:15:04