[英]Python subprocess.communicate stderrdata not printing
我正在將所有getstatusoutput用法更改為python腳本中的子進程。 這兩種方法都返回 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, "out={}".format(out)) 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
object 直到過程引發一些錯誤,然后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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.