簡體   English   中英

Linux管道已完成讀取,但要放棄其余部分

[英]Linux pipe finished reading but want to discard rest

我有一段代碼正在啟動一個過程,然后從stdout讀取以查看它是否已加載好。

之后,理想情況下,我想將輸出重定向到/dev/null或丟棄它的東西。 我當時是(A)在這種情況下的最佳做法是什么,(B)如果管道已滿,則寫入過程將會如何? 當管道變滿並且未被讀取/清除時,它將阻塞嗎?

如果目標是重定向到/dev/null ,那么有可能向我展示如何使用python和subprocess.Popen做到這一點?

proc = subprocess.Popen(command, stderr=subprocess.PIPE)
while True:
    if init_string in proc.stderr.readline():
        break;

proc.stderr.redirect ?? 

據我所知,子進程開始執行后,無法關閉和重新打開它的文件描述符。 是的,操作系統中的緩沖區有限,因此,如果您不從管道中消耗任何東西,最終子進程將阻塞。 這意味着您只需要繼續從管道讀取數據,直到從寫入端將其關閉為止。

如果您希望程序在此期間繼續做一些有用的事情,請考慮將數據消耗部分移至單獨的線程(未經測試):

def read_all_from_pipe(pipe):
  for line in pipe: # assuming it's line-based
    pass

Thread(lambda: read_all_from_pipe(proc.stderr)).start()

但是,可能還有其他方法可以解決您的問題。 為什么首先需要等待某些特定輸出? 如果孩子沒有“加載正常”,它是否應該死於非零退出代碼? 您能代替檢查孩子在做什么嗎,而不是在打印一些任意輸出?

如果要放棄所有輸出:

python your_script.py > /dev/null

但是,如果要從Python進行操作,可以使用:

import sys
sys.stdout = open('file', 'w')
print 'this goes to file'

每次打印時,標准輸出都已重定向到文件“文件”,將其更改為/ dev / null或所需的任何文件,您將獲得所需的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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