Python subprocess.communicate stderrdata无法打印

问题描述

我正在将所有 getstatusoutput 用法更改为python脚本中的 subprocess 。两种方法都返回stdout和stderr。两者的标准输出一致。但是,尽管对于getstatusoutput,stderr为0,但对于subprocess.communicate,则为空白。

getstatus输出代码

cmd = "openssl verify -CAfile {} {}".format(root_cert,subca_cert)
status,out = commands.getstatusoutput(cmd)
LOG(OKGREEN,"out={}".format(out))
LOG(OKGREEN,"status={}".format(status))

打印我的期望:

out=sub_ca.cer: OK 
status=0

但是子流程代码

cmd = ['openssl','verify','-CAfile',root_cert,subca_cert]
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
(out,status) = p.communicate()
LOG(OKGREEN,"status={}".format(status))

打印此内容

out=innerspace.cer: OK

status=

一个额外的换行符,stderr为空白。您能发现我做错了什么吗? 供参考:https://docs.python.org/2/library/subprocess.html#popen-objects

解决方法

如果要使用Popen,则要使用的是Popen.returncode

那是因为stderr中没有任何状态。您的status变量是一个None对象,直到该过程引起一些错误为止,然后stderr将写入您拥有的status变量。如果没有错误,它将保留为None,因此不打印任何内容。我已经使用更改更新了您的代码。

cmd = ['openssl','verify','-CAfile',root_cert,subca_cert]
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
out,errors = p.communicate()
LOG(OKGREEN,"out={}".format(out))
LOG(OKGREEN,"status={}".format(p.returncode))