2017-06-02 110 views
1

我在python 2.7中寫了一個非常簡單的腳本,叫做slowcat.py,它允許我以每秒一定的字節速率對cat文件。現在問題在於給出的速率在輸出流上增加了一倍。所以rate = 1字節導致每秒2字節,rate = 4字節導致每秒8字節。見代碼片段的實際方案:Python:標準輸出速率是它應該是的兩倍

#!/usr/bin/env python 

import argparse 
import time 
import sys 
import os 


def get_configuration(): 
    """ 
    Returns a populated configuration 
    """ 
    parser = argparse.ArgumentParser() 
    parser.add_argument('file', metavar='FILE', type=argparse.FileType('r'), 
         nargs='?', help="Input file") 
    parser.add_argument('--rate', type=int, default=666880, 
         help="Output rate in bytes per second") 

    return parser.parse_args() 


def main(): 
    cfg = get_configuration() 

    size = os.path.getsize(cfg.file.name) 
    bytes_read = 0 

    t1 = time.time() 
    while True: 
     n = min(cfg.rate, size-bytes_read) 
     if n <= 0: 
      break 
     buf = cfg.file.read(n) 
     sys.stdout.write(buf) 
     sys.stdout.flush() 
     bytes_read += n 
     t2 = time.time() 
     if t2-t1 < 1.0: 
      time.sleep(1.0 - (t2-t1)) 
     t1 = t2 


if __name__ == "__main__": 
    main() 

現在我的問題是:爲什麼是我所傳遞的命令行上輸出速率的雙?如果你複製粘貼代碼片段,你可以很容易地在你的系統上試用它,例如python slowcat.py --rate 2 slowcat.py

回答

2

問題是while循環末尾的t1 = t2。那設置t1到時間之前sleep延遲,所以下次您測試經過的時間間隔將超過1秒,因此sleep調用將被跳過。

爲了解決這個問題,最後一行改爲

t1 = time.time() 

BTW,它可能是使用新time.perf_counter()而不是了time.time()

+0

呸,是如此愚蠢的我的更準確。謝謝。 –

相關問題