命令如下:
try:
op = subprocess.run(['docker', 'login', '-u', 'username', '-p', 'password', 'dockerhub.com'], check=True, stdout=sys.stdout, stderr=subprocess.PIPE)
print("Docker stdout :", op.stdout)
print("Docker Error :", op.stderr.decode("utf-8"))
except:
traceback.print_exc()
当提供正确的密码并且两个print语句按预期工作时,它工作良好。
Login Succeeded
Docker stdout : None
Docker Error :
如果密码不正确,我希望捕获在shell(bash)上运行时看到的输出,如下所示:
Error response from daemon: Get https://dockerhub.com/v2/: unknown: Bad credentials
相反,我收到的是回溯,其中没有看到上述错误消息。
Traceback (most recent call last):
File "/home/scripts/test.py", line 54, in my_func
op = subprocess.run(['docker', 'login', '-u', 'username', '-p', 'incorrectpassword', 'dockerhub.com'], check=True, stdout=sys.stdout, stderr=subprocess.PIPE)
File "/usr/local/lib/python3.5/subprocess.py", line 708, in run
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['docker', 'login', '-u', 'username', '-p', 'incorrectpassword', 'dockerhub.com']' returned non-zero exit status 1
Traceback (most recent call last):
您还可以捕获subprocess.CalledProcessError
异常。该异常的属性保存了参数、退出代码,以及捕获到的标准输出和标准错误。
try this (add capture_output=True)
try:
op = subprocess.run(['docker', 'login', '-u', 'username', '-p', 'password', 'dockerhub.com'], check=True, stdout=sys.stdout, stderr=subprocess.PIPE,capture_output=True)
print("Docker stdout :", op.stdout)
print("Docker Error :", op.stderr.decode("utf-8"))
except:
traceback.print_exc()
两句话:
1:你用check=True
呼叫subprocess.run()
。这会导致您观察到的异常。
参见文档:
如果是真的,和一个非零退出代码的进程退出时,将会引发一个
CalledProcessError
异常。该异常的属性保存了参数、退出代码,以及捕获到的标准输出和标准错误。
简单的解决方案是使用check=False
(这是默认值,因此您可以删除该参数)。然后在subprocess.run()
完成后,检查op.returncode
和op.stderr
。
或者,您可以使用check=True
捕获异常,这在其他答案中也提到过。
2:你用了stdout=sys.stdout, stderr=subprocess.PIPE
.
这将把进程的标准输出打印到系统(即控制台)的标准输出。如果您想捕获标准输出,您应该使用stdout=subprocess.PIPE
代替(或使用capture_output=True
,这是设置stdout
和stderr
参数的另一种方法)。