subprocess.run() 的输出为空



命令如下:

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异常。该异常的属性保存了参数、退出代码,以及捕获到的标准输出和标准错误。

<>之前尝试:op = subprocess.run(['docker', 'login', '-u', 'username', '-p', 'password', 'dockerhub.com'], check=True, stdout=sys。stdout, stderr = subprocess.PIPE)print("Docker标准输出:",op.标准输出)除了子流程。CalledProcessErrorase:Exit_code = e.returncodesterror =e。stderr打印(exit_code stderror)

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.returncodeop.stderr

或者,您可以使用check=True捕获异常,这在其他答案中也提到过。

2:你用了stdout=sys.stdout, stderr=subprocess.PIPE.

这将把进程的标准输出打印到系统(即控制台)的标准输出。如果您想捕获标准输出,您应该使用stdout=subprocess.PIPE代替(或使用capture_output=True,这是设置stdoutstderr参数的另一种方法)。

最新更新