【问题标题】:Detect if a python module changes and then reload检测 python 模块是否更改然后重新加载
【发布时间】:2011-09-10 08:30:22
【问题描述】:

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

所以,当我启动守护进程时,我会等待……比如说……加载所有内容需要 2 分钟,这在总体方案中还算不错。然而,对于开发来说,这变得很痛苦,因为我需要每次都重新启动守护进程,这浪费了我很多时间。

大多数模块只需几秒钟即可加载。理想情况下,我想做的是检测特定模块中的任何文件何时发生更改,然后重新加载该特定模块。我已经知道how to reload a module,但此时我不知道如何查看特定模块的更改。请记住,在这种情况下,模块不是单个 .py 文件,而是包含 __init__.py 和 5-10 个 .py 文件的目录,因此我需要检测何时 any其中有变化。

这是项目布局(如果有什么不同的话)

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

【问题讨论】:

  • 在执行任何操作之前是否重新加载已检查文件是否已更改?
  • @Bastien:在查看了 reload 的文档之后,不,我不相信 reload 的行为是这样的。如果我错了,请纠正我。

标签: python import runtime


【解决方案1】:

Detect File Change Without Polling

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

【讨论】:

  • 非常好!我正在考虑尝试在调用模块之前确定模块是否已更改,但是这样做我可以在文件更改的那一刻重新加载。没想到。
  • 很高兴能帮上忙,也很高兴我发现了你的问题,这对于我正在研究的事情会派上用场,而且我之前没有考虑过这种技术可以节省时间.
【解决方案2】:

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

【讨论】:

  • 你将如何处理确定哪些文件属于一个模块?从顶层我所拥有的只是模块名称。
  • 我会递归地查看文件夹。是否存在不是代码或配置文件的经常更改的文件?
  • 另外,启动需要2分钟的你在做什么?
  • 除了reasons_i_hate_my_job.txt,不是真的
  • 哦,你不想知道。其中一部分是将许多非常大的对象加载到内存中。
【解决方案3】:

这是一个老问题,但如果你偶然发现它,如果你使用 IPython,这里有一个解决方案:

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

%load_ext autoreload
%autoreload 2

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 2014-06-16
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2018-10-20
    • 2010-10-08
    • 2011-05-06
    相关资源
    最近更新 更多