检测Python模块是否更改并重新加载

29 投票
3 回答
15465 浏览
提问于 2025-04-16 19:07

我正在开发一个比较大的Python项目,里面有很多模块。这个“主”模块是一个守护进程(实际上是一个Thrift守护进程),它会调用其他模块来实现具体的功能。启动这个守护进程需要花费很长时间,因为有些模块的初始化过程比较复杂。

所以每次我启动守护进程时,得等……比如说……2分钟才能加载完,这在整体上还算可以。但是在开发过程中,这就变得很麻烦,因为我每次都需要重启守护进程,这让我浪费了很多时间。

大多数模块加载只需要几秒钟。理想情况下,我希望能检测到某个模块中的文件是否有变化,并重新加载那个模块。我已经找到了如何重新加载模块的方法,但现在我还不知道怎么监控某个模块的变化。需要注意的是,在这种情况下,模块并不是一个单独的.py文件,而是一个包含__init__.py和5到10个.py文件的目录,所以我需要检测到其中任何文件的变化。

这是项目的结构(如果有影响的话)

project
| -- daemonize.py
| -- main.py
| -- moduleA
|    | -- __init__.py
|    | -- happy_panda.py
|    ` -- sad_panda.py
| -- moduleB
|    | -- __init__.py
|    | -- takes_forever_to_load.py
|    ` -- seriously_get_some_coffee.py
| -- moduleC
|    | -- __init__.py
|    | -- frequently_changes.py
|    | -- reasons_i_hate_my_job.txt
|    ` -- home_address_of_moduleB_developer.txt
` -- service.py <-- uses modules A, B, and C

任何想法或建议都很受欢迎。

编辑

感谢大家的反馈。根据建议,我写了以下代码。现在有一个小问题,就是pyinotify似乎会收到多个通知,但对我来说这个问题不大,所以我不打算去修复它。

https://gist.github.com/1013122

3 个回答

1

这是一个老问题,但如果你碰到它,这里有一个解决办法,适用于使用IPython的情况:

你可以在IPython的提示符下随时输入以下几行代码:

%load_ext autoreload
%autoreload 2

想要了解更多选项,可以查看这个链接: https://ipython.readthedocs.io/en/stable/

1

我会查看所有的文件,然后检查一下文件是否被修改过。如果有修改的话,我就会重新加载这个文件。

9

检测文件变化而不需要轮询

如果你已经知道怎么重新加载你的模块,那么这个答案基本上就能满足你的需求。它使用了 Inotify 这个工具来“通知”(看看他们用的这个词)程序,当文件被修改时。

撰写回答