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
相关产品推荐
相关产品推荐

