问题描述
我正在将所有 getstatusoutput 用法更改为python脚本中的 subprocess 。两种方法都返回stdout和stderr。两者的标准输出一致。但是,尽管对于getstatusoutput,stderr为0,但对于subprocess.communicate,则为空白。
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))