python中简单、现代的文件监视和代码重新加载。
watchgod的Python项目详细描述
python中简单、现代的文件监视和代码重新加载。
用法
监视目录中的更改:
fromwatchgodimportwatchforchangesinwatch('./path/to/dir'):print(changes)
运行函数并在代码更改时重新启动:
fromwatchgodimportrun_processdeffoobar(a,b,c):...run_process('./path/to/dir',foobar,args=(1,2,3))
run_process使用PythonWatcher,因此只有对python文件的更改才会提示 重新加载,请参见下面的custom watchers。
如果需要有关更改事件的通知以及重新启动进程,可以 使用callback参数传递将在每次文件更改时调用的函数 只有一个参数:文件更改集。
异步方法
watchgod附带了一个异步等价物watch:awatch,它使用 迭代文件的ThreadPoolExecutor。
importasynciofromwatchgodimportawatchasyncdefmain():asyncforchangesinawatch('/path/to/dir'):print(changes)loop=asyncio.get_event_loop()loop.run_until_complete(main())
还有一个异步等价的run_process:arun_process,依次是 使用awatch:
importasynciofromwatchgodimportarun_processdeffoobar(a,b,c):...asyncdefmain():awaitarun_process('./path/to/dir',foobar,args=(1,2,3))loop=asyncio.get_event_loop()loop.run_until_complete(main())
arun_process使用PythonWatcher,因此只有对python文件的更改才会提示 重新加载,请参见下面的custom watchers。
arun_process的签名与run_process几乎相同,只是 如果provide,callback参数必须是一个协程,而不是函数。
自定义观察者
watchgod附带了以下watcher类,这些类可以通过^{tt15}使用$ 上述任何方法的关键字参数。
有关详细信息,请签出 watcher.py, 很简单。
- allwatcher
- 基本观察程序,检查所有文件是否有更改。
- defaultwatcher
- 默认情况下由watch和awatch使用的观察程序,通常被忽略的文件 像*.swp、*.pyc和*~这样的目录被忽略 .git.
- pythonwatcher
- 特定于python文件,只监视*.py、*.pyx和*.pyd文件。
- defaultdirwatcher
- 是DefaultWatcher和DefaultDirWatcher的基础,并负责忽略 一些常规目录。
如果这些类不够,您可以定义自己的观察程序,特别是 您需要重写should_watch_dir和should_watch_file。除非你是 做一些非常奇怪的事情,你会想从DefaultDirWatcher继承。
cli
wathgod还附带了一个用于运行和重新加载python代码的cli。
假设你有foobar.py:
fromaiohttpimportwebasyncdefhandle(request):returnweb.Response(text='testing')app=web.Application()app.router.add_get('/',handle)defmain():web.run_app(app,port=8000)
如果当前目录中的任何文件更改为:
watchgod foobar.main
运行watchgod --help获取更多选项。watchgod也可用作python可执行模块 通过python -m watchgod ...。
为什么不支持inotify/kqueue/fsevent/winapi
watchgod(目前)使用文件轮询,而不是操作系统内置的文件更改通知。
这不是一个疏忽,而是一个具有以下理由的决定:
轮询“足够快”,特别是自从pep 471引入fastscandir以来。
有一个相当大的项目,比如Tutorcruncher代码库,有850个文件和300K行 代码的watchgod可以在~24ms内扫描整个树。 一个CPU的5%——开发期间完全可以接受的负载。
线索在标题中,至少有4个不同的文件通知系统需要集成 有了,大部分都不是小事。在我们讨论不同操作系统版本之间的变化之前。
当您想要分组或“取消缓冲”更改时,轮询工作得很好。
假设您正在运行一个dev服务器,并且您在git中更改了分支,100个文件更改了。 您想重新加载开发服务器100次还是一次?正确的。
定期轮询可能会将这些更改分组为一个事件。如果你收到 接收到第一个事件时需要延迟重新加载执行的事件流 看看这是不是一堆文件更改的一部分,thiS并不完全是微不足道的。
尽管如此,我仍然可以实现inotify支持。我不用别的东西 所以我绝对不会为其他操作系统提供专门的支持。