簡體   English   中英

Python subprocess.communicate stderrdata 不打印

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM