python中简单、现代的文件监视和代码重新加载。

watchgod的Python项目详细描述


BuildStatusCoveragepypi

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附带了一个异步等价物watchawatch,它使用 迭代文件的ThreadPoolExecutor

importasynciofromwatchgodimportawatchasyncdefmain():asyncforchangesinawatch('/path/to/dir'):print(changes)loop=asyncio.get_event_loop()loop.run_until_complete(main())

还有一个异步等价的run_processarun_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
默认情况下由watchawatch使用的观察程序,通常被忽略的文件 像*.swp*.pyc*~这样的目录被忽略 .git.
pythonwatcher
特定于python文件,只监视*.py*.pyx*.pyd文件。
defaultdirwatcher
DefaultWatcherDefaultDirWatcher的基础,并负责忽略 一些常规目录。

如果这些类不够,您可以定义自己的观察程序,特别是 您需要重写should_watch_dirshould_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(目前)使用文件轮询,而不是操作系统内置的文件更改通知。

这不是一个疏忽,而是一个具有以下理由的决定:

  1. 轮询“足够快”,特别是自从pep 471引入fastscandir以来。

    有一个相当大的项目,比如Tutorcruncher代码库,有850个文件和300K行 代码的watchgod可以在~24ms内扫描整个树。 一个CPU的5%——开发期间完全可以接受的负载。

  2. 线索在标题中,至少有4个不同的文件通知系统需要集成 有了,大部分都不是小事。在我们讨论不同操作系统版本之间的变化之前。

  3. 当您想要分组或“取消缓冲”更改时,轮询工作得很好。

    假设您正在运行一个dev服务器,并且您在git中更改了分支,100个文件更改了。 您想重新加载开发服务器100次还是一次?正确的。

    定期轮询可能会将这些更改分组为一个事件。如果你收到 接收到第一个事件时需要延迟重新加载执行的事件流 看看这是不是一堆文件更改的一部分,thiS并不完全是微不足道的。

尽管如此,我仍然可以实现inotify支持。我不用别的东西 所以我绝对不会为其他操作系统提供专门的支持。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java错误:无法找到或加载主类   Base85又名ASCI85 java项目   在Java oracle过程中创建Clob对象时引发AbstractMethodError   访问布尔Java时出现NullPointerException   在Java中压缩和解压缩字符串的调试程序   java了解JavaMail下未读消息的不同方法   java Vaadin 10网格样式基于内容的单个行   java使用Sparql查询识别实体的类别/分类   java如何在组件的设计阶段防止内存泄漏?   java使用共享首选项在应用程序上保存更改的语言   Spring数据jpa中具有复合PK的表的java本机查询   java复选框节点树