簡體   English   中英

如何在python子進程的管道執行中捕獲中間錯誤

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

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