![](/img/trans.png)
[英]Python - Subprocess - How to call a Piped command in Windows?
[英]How to capture intermediate error in python subprocess's piped execution
在python doc替換shell-pipeline之后,我有一段看起來像這樣的代碼。
p1 = Popen(["tac" , "/var/log/some_process_log.output"], stderr=PIPE, stdout=PIPE)
p2 = Popen(["head", "-n", "1000"], stdin=p1.stdout, stdout=outfile)
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
outfile
是我想重定向head
命令輸出的地方。 日志文件非常大,因此我正在做一個“頭”
鏈接就像p1 | p2 | p3 | ..... | Pn > outfile
p1 | p2 | p3 | ..... | Pn > outfile
如果執行p1時出錯,例如用戶對/var/log/some_process_log.output
文件沒有讀權限,那么當我執行Pn.communicate()
時, p1.stderr
錯誤消息不會通過管道傳遞
如果我在每個階段都執行p1.stderr.readline(),那么處理需要很長時間 。 這在pydocs中提到:
注意讀取的數據緩沖在內存中,因此如果數據大小很大或不受限制,請不要使用此方法。
我避免使用subprocess.check_output,因為它不處理管道,而且需要不安全的shell=True
任何幫助,將不勝感激。 謝謝
您可以創建一個單獨的管道:
import os
errread, errwrite = os.pipe()
並將write-end設置為所有Popen
實例的stderr
:
p1 = Popen(["tac" , "/var/log/some_process_log.output"], stderr=errwrite, stdout=PIPE)
p2 = Popen(["head", "-n", "1000"], stdin=p1.stdout, stderr=errwrite, stdout=outfile)
記得完成后關閉寫端:
os.close(errwrite)
並使用以下任一方式獲取錯誤消息:
data_group = os.read(errread, buf_size)
要么:
import io
data = io.open(errread, 'rb', buf_size).read()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.