詳細

2017-05-12 24 views
0

実行log.py befure follow.pyそれだけでtail -fのように、動作しますが、それは動作しませんlog.pyfollow.pyを実行し、私は、ファイル、access-logで何かを追加Vimを使用している場合、それはどちらも動作しません。詳細

なぜですか? flushの前

\0を書いて、readline後にそれが継続しない\0または何か他のものを読んでいないのですか?

flushreadlineの詳細は?あなたが最初follow.pyを実行した場合

# log.py 

f = open("access-log","w") 

import time, random 
while True: 
    time.sleep(random.random()) 
    n = random.randint(0,len(ips)-1) 
    m = random.randint(0,len(docs)-1) 
    t = time.time() 
    date = time.strftime("[%d/%b/%Y:%H:%M:%S -0600]",time.localtime(t)) 
    print >>f,"%s - - %s %s" % (ips[n],date,docs[m]) 
    f.flush() 


# follow.py 

import time 
def follow(thefile): 
    thefile.seek(0,2)  # Go to the end of the file 
    while True: 
     line = thefile.readline() 
     if not line: 
      time.sleep(0.1) # Sleep briefly 
      continue 
     yield line 

# Example use 
if __name__ == '__main__': 
    logfile = open("access-log") 
    for line in follow(logfile): 
     print line, 

答えて

1

は、それがアクセスログを開き、継続的にそれから何かを読み取ろうとします。

しかし、その後log.pyは一緒に来て、既存access-logのファイルを削除し、新しいものを作成しopen("access-log", "w")を呼び出します。

follow.pyは、元のファイルが開いていたので、オペレーティングシステムはそれにファイルハンドルを維持するが、それはもう同じファイル名ではありません(実際にはまったく名前がありません。)follow.pyその新しいファイルについて知っていることはありません作成され、元のファイルハンドルから永遠に読み込まれています。

おそらくlog.py"a"の代わり"w"でオープンを呼び出す必要がありますか?

+0

ありがとう – caimaoy