V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
masterzh01
V2EX  ›  Python

python 有没实时文件监控的 tail -F?

  •  
  •   masterzh01 · 2016-09-03 00:56:14 +08:00 · 5527 次点击
    这是一个创建于 3012 天前的主题,其中的信息可能已经有所发展或是发生改变。

    tail -F 的源码是采用 inotify + select 方式来实现

    python 的 pyinotify 库对 inotify 进行了封装,但貌似性能不是很好。

    实现 tail-F: https://github.com/masterzh01/tail-F

    6 条回复    2016-09-03 23:55:27 +08:00
    necomancer
        1
    necomancer  
       2016-09-03 02:24:50 +08:00
    from sys import argv
    import collections


    o = open(argv[1], 'r')
    print(''.join(collections.deque(o, 5)).strip('\n')) # last 5 lines
    o.seek(0,2) # jump to last line
    while 1:
    ....line = o.readline()
    ....if line:
    ........print(line.strip('\n'))

    就可以了吧……
    masterzh01
        2
    masterzh01  
    OP
       2016-09-03 08:45:38 +08:00
    @necomancer 不行, cpu , rotate.....( tail -F )
    hasdream
        3
    hasdream  
       2016-09-03 10:09:33 +08:00
    ```
    import time

    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,

    ```
    necomancer
        4
    necomancer  
       2016-09-03 13:20:33 +08:00
    @masterzh01 CPU usage 问题加上 sleep 就行:

    from sys import argv
    import collections
    import time

    o = open(argv[1], 'r')
    print(''.join(collections.deque(o, 5)).strip('\n')) # last 5 lines
    o.seek(0,2) # jump to last line
    while 1:
    ....line = o.readline()
    ....if not line:
    ........time.sleep(0.1)
    ........continue
    ....print(line.strip('\n'))
    masterzh01
        5
    masterzh01  
    OP
       2016-09-03 22:32:17 +08:00
    @hasdream @necomancer 事件驱动方式会更好些?
    hasdream
        6
    hasdream  
       2016-09-03 23:55:27 +08:00 via Android
    @masterzh01 如果用事件来做基本没延迟 不过要复杂点还要对事件处理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5447 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:31 · PVG 09:31 · LAX 17:31 · JFK 20:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.