python中的flush和readline的详细信息

时间:2017-05-12 03:40:48

标签: python operating-system

运行log.py befure follow.py它可以正常工作,就像tail -f一样,但在follow.py之前运行log.py它不起作用,如果我使用vim添加文件中的某些内容access-log,它不起作用。

为什么?

flush之前没有写\0readline\0后它没有继续或其他什么?

flushreadline的详细信息是什么?

# 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 个答案:

答案 0 :(得分:1)

如果您先运行follow.py,它会打开访问日志并不断尝试从中读取内容。

然后log.py出现并调用open("access-log", "w") 删除现有的access-log文件并创建一个新文件。

由于follow.py打开了原始文件,操作系统会维护一个文件句柄,但它不再是相同的文件名(实际上它根本没有名称。)follow.py从来不知道创建的新文件,并且永远无法从原始文件句柄读取。

或许log.py应该使用"a"而不是"w"来打开?