使用 Python 进行热重载/交换 [重复]
Posted
技术标签:
【中文标题】使用 Python 进行热重载/交换 [重复]【英文标题】:hot reloading / swapping with Python [duplicate] 【发布时间】:2011-04-21 05:50:50 【问题描述】:我希望代码更改在开发过程中立即生效。如何检测更改的文件并在运行的 Python (2.7) 应用程序中重新加载它们?
编辑:
阅读“Ivo van der Wijk”链接的页面后,我认为最好在代码更改时重新启动 Web 应用程序 - 就像 Django 一样。所以实际的问题是:How to monitor file modifications?
【问题讨论】:
【参考方案1】:我希望我的一些 Python 脚本具有相同的效果,所以我继续制作脚本 SourceChangeMonitor.py。您可以通过说明here 找到它。如果你只想要脚本,here 是直接链接
【讨论】:
谢谢我喜欢它。如果有人感兴趣,我将其移植到 python3:github.com/makerGeek/python-hotreload【参考方案2】:这对大多数应用程序没有意义,因为使用reload
会产生副作用。加上您花在检测更改和重新加载所有模块的代码上的时间可能只花在重新启动应用程序上。如果你导入很多模块或者有一个包含很多子模块的项目,那就很复杂了。
在某些情况下,这是个好主意。 Django Web 框架提供了一个开发服务器 (manage.py runserver
),它会自动重新加载更改的模块。看看django.utils.autoreload
- 它使用文件的修改时间测试所有 Python 文件的修改。如前所述,这仅适用于某些应用程序。 Web 应用程序在某种程度上是无状态的,因此可以重新加载而几乎没有副作用。
【讨论】:
当模块发生变化时,Django 会重新加载整个程序。重新加载单个模块是非常危险的,特别是因为你在开发过程中这样做,它会导致的问题会与你试图修复的真正错误混合在一起,从而使问题更加复杂。【参考方案3】:有人问过这个问题anumberoftimes
您可以为此使用 reload(module),但要注意讨厌的副作用。例如,现有代码将基于原始代码,它不会神奇地添加新的属性或基类。
【讨论】:
以上是关于使用 Python 进行热重载/交换 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Docker 上的 Erlang/Elixir 和热代码交换