簡體   English   中英

從文件中讀取 TQDM Output

[英]Read TQDM Output From File

這主要是一個一般的 python 問題,我在分布式環境中工作,所以我的工作人員將他們的標准輸出和標准錯誤寫入共享文件系統上的文件(我無法更改)。 我希望我的啟動器腳本讀取其中一個文件並實時打印出來以大致跟蹤工作人員的進度,每個工作人員都使用 tqdm 輸出進度條。 我很高興看到運行文件的tail -f正確輸出進度條,例如,進度條在一行上更新,就像我在本地運行 tqdm 時一樣。 但是,當我嘗試用 python 包裝它時,使用以下 function:

def follow(job : submitit.Job) -> Iterator[str]:
    with open(job.paths.stdout) as fo:
        with open(job.paths.stderr) as fe:
            while True:
                lo = fo.readline()
                    
                if lo:
                    yield lo         

                le = fe.readline()
                if le:
                    yield le

                if job.state != 'RUNNING' and not (le or lo):
                    break
                else:
                    time.sleep(1)

loglines = follow(job)
for line in loglines:
    print(line, end='', flush=True)

它不這樣做,例如我得到一個換行符,並且通過打印新行來更新進度條,它似乎沒有處理\x1b[A tqdm 正在寫入的字符。

有沒有辦法純粹在 python 中做到這一點?

我能夠通過使用讀取二進制模式來解決這個問題,使用read來讀取文件末尾,然后將生成的字節解碼為ascii而不是 UTF-8 的 python 3 默認值。 更新后的工作遵循 function 如下:

def follow(job : Job) -> Iterator[str]:
    with open(job.paths.stdout, 'rb') as fo:
        with open(job.paths.stderr, 'rb') as fe:
            while True:
                lo = fo.read().decode('ascii')
                    
                if lo:
                    yield lo   

                le = fe.read().decode('ascii')
                if le:
                    yield le

                if job.state != 'RUNNING' and not le and not lo:
                    break
                else:
                    time.sleep(0.1)

暫無
暫無

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

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