检测python模块是否更改然后重新加载

时间:2011-06-07 19:13:59

标签: python import runtime

所以我正在开发一个包含许多模块的相当大的python项目。 “main”(可运行)模块是一个守护进程(实际上是一个Thrift守护进程),它调用其他模块来实现其实际功能。启动守护程序需要很长时间,因为某些模块具有相当冗长且涉及的初始化过程。

所以,当我启动守护进程时,我等待......让我们说...加载所有内容需要2分钟,这在宏伟的计划中并不算太糟糕。然而,对于开发而言,它变成了一个主要的痛苦,因为我需要每次都重新启动守护进程,这一直浪费了我很多时间。

大多数模块只需几秒钟即可加载。理想情况下,我想要做的是检测特定模块中的任何文件何时发生更改,然后重新加载该特定模块。我已经想出了how to reload a module,但此时我无法弄清楚如何观察特定模块的变化。请记住,在这种情况下,模块不是单个.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 个答案:

答案 0 :(得分:9)

Detect File Change Without Polling

再加上你已经知道如何重新加载你的模块这个答案几乎填补了它。它使用Inotify在文件被修改时“通知”(看看他们在那里做了什么)程序。

答案 1 :(得分:1)

我会查看所有文件,detect if a file was modified。如果是的话,我会reload它。

答案 2 :(得分:0)

这是一个古老的问题,但是如果您偶然发现它,那么使用IPython可以解决此问题:

随时在IPython提示符中输入以下行

%load_ext autoreload
%autoreload 2

有关更多选项,请查看此链接: https://ipython.readthedocs.io/en/stable/