我正在为Web应用程序编写一个日志文件查看器,为此我想通过日志文件的行分页.文件中的项目是基于行的,底部是最新项目.
所以我需要一种tail()方法,可以n从底部读取行并支持偏移量.我想出的是这样的:
def tail(f, n, offset=0):
"""Reads a n lines from f with an offset of offset lines."""
avg_line_length = 74
to_read = n + offset
while 1:
try:
f.seek(-(avg_line_length * to_read), 2)
except IOError:
# woops. apparently file is smaller than what we want
# to step back, go to the beginning instead
f.seek(0)
pos = f.tell()
lines = f.read().splitlines()
if len(lines) >= to_read or pos == 0:
return lines[-to_read:offset and -offset or None]
avg_line_length …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Python程序中的方法来检测文件系统上的文件是否已被修改.我知道我可以在每5秒运行一次以检查系统的最后修改日期,但我很好奇是否有更简单的方法来执行此操作,而无需要求我的程序重复检查.
有谁知道这样的方法?
我正在寻找一个跨平台文件监控python包?我知道可以使用pywin32监视windows上的文件,并且有些软件包可以在Linux/Unix上运行,但是有人知道跨平台的吗?
伙计们,我需要查看日志文件以进行更改.在查看了stackoverflow问题之后,我看到人们推荐"看门狗".所以我正在尝试测试,并且不确定在文件更改时添加代码的位置:
#!/usr/bin/python
import time
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
if __name__ == "__main__":
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path='.', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
else:
print "got it"
except KeyboardInterrupt:
observer.stop()
observer.join()
Run Code Online (Sandbox Code Playgroud)
如果文件已被添加/更改,我在哪里添加"得到它",在while循环中?
在python核心中找不到任何东西来做这件事.任何人都可以推荐一个库或"电池"来做到这一点?理想情况下,我希望这是可移植的,但如果它只适用于Unix(我的服务器),那就没关系.
以下代码允许您修改runtime.py运行时的内容.换句话说,您不必中断runner.py.
#runner.py
import time
import imp
def main():
while True:
mod = imp.load_source("runtime", "./runtime.py")
mod.function()
time.sleep(1)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
在运行时导入的模块是:
# runtime.py
def function():
print("I am version one of runtime.py")
Run Code Online (Sandbox Code Playgroud)
这种原始机制允许您"如何交换"Python代码(la Erlang).还有更好的选择吗?
请注意,这只是一个学术问题,因为我没有必要做这样的事情.但是,我有兴趣了解有关Python运行时的更多信息.
编辑:
我创建了以下解决方案:一个Engine对象提供了一个模块中包含的函数的接口(在这种情况下,模块被调用engine.py).该Engine对象还生成一个线程,用于监视源文件中的更改,如果检测到更改,则会调用notify()引擎上的方法,该方法会重新加载源文件.
在我的实现中,更改检测基于每秒frequency检查文件的SHA1校验和的轮询,但是其他实现也是可能的.
在此示例中,检测到的每个更改都会记录到已调用hotswap.log校验和的文件中.
用于检测改变的其他机制可以是服务器或使用inotify中的Monitor线程.
import imp
import time
import hashlib
import threading
import logging
logger = logging.getLogger("")
class MonitorThread(threading.Thread):
def __init__(self, engine, frequency=1): …Run Code Online (Sandbox Code Playgroud) 当我指定的文件被修改时,我想调用我的chrome或firefox浏览器.我怎么能"监视"该文件在修改后做某事?
程序上似乎步骤是..基本上每隔一秒左右设置一个永不停止的间隔,并缓存初始修改日期,然后每隔一秒比较日期,当它改变调用X.
我需要在python中知道每当在特定目录中添加/删除/修改新文件时有没有办法呢?我正在寻找一种类似"inofity"的功能(来自POSIX).
谢谢
我正在尝试使用Python的asyncio库来确定一种观察文件外观的好方法.这是我到目前为止所提出的:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Watches for the appearance of a file."""
import argparse
import asyncio
import os.path
@asyncio.coroutine
def watch_for_file(file_path, interval=1):
while True:
if not os.path.exists(file_path):
print("{} not found yet.".format(file_path))
yield from asyncio.sleep(interval)
else:
print("{} found!".format(file_path))
break
def make_cli_parser():
cli_parser = argparse.ArgumentParser(description=__doc__)
cli_parser.add_argument('file_path')
return cli_parser
def main(argv=None):
cli_parser = make_cli_parser()
args = cli_parser.parse_args(argv)
loop = asyncio.get_event_loop()
loop.run_until_complete(watch_for_file(args.file_path))
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
我把它保存为watch_for_file.py,并可以运行它
python3 watch_for_file.py testfile
Run Code Online (Sandbox Code Playgroud)
在另一个shell会话中,我发布
touch testfile
Run Code Online (Sandbox Code Playgroud)
结束循环.
有没有比使用这个无限循环更优雅的解决方案yield …
假设我有两个或更多处理SQLite数据库的进程 - 一个"播放器"进程和许多"编辑器"进程.
"播放器"进程读取数据库并更新视图 - 在我的情况下,根据存储在数据库中的事件,它将是混合到声卡的波形.
"编辑器"进程是该数据库的任何编辑器:它不断地更改数据库.
现在我希望播放器快速反映编辑更改.
我知道SQLite提供了钩子来跟踪同一进程中的数据库更改,但似乎没有关于如何使用多个进程执行此操作的信息.
我可以不断地轮询数据库,比较记录和触发事件,但这似乎效率很低,特别是当数据库增长到很大的时候.
我正在考虑使用日志表和触发器,但我想知道是否有一个更简单的方法.
python ×10
file ×3
monitoring ×2
file-io ×1
filesystems ×1
hotswap ×1
inotify ×1
linux ×1
logfiles ×1
python-3.x ×1
sqlite ×1
tail ×1
watchdog ×1