django, python: 在shell中重载函数
我在使用django的IPython命令行,可以通过运行manage.py shell
来启动它。当我在命令行中加载一个外部函数进行测试时,一切都很顺利。但是,当我对这个函数进行修改后,命令行里还是显示的是旧版本的函数。即使我重新导入,也没有变化。
有没有人知道怎么才能加载到这个函数的最新版本呢?
谢谢大家!
补充:我使用的是Windows系统,不知道这是否会有影响。
5 个回答
1
在导入任何代码之前,先启用 IPython 的自动重载扩展:
%load_ext autoreload
%autoreload 2
我在普通的 Django shell 中使用这个功能,效果很好,不过也有一些限制:
注意事项:
可靠地重新加载 Python 模块通常比较困难,可能会出现一些意想不到的情况。%autoreload 试图通过用新版本替换模块中之前的函数代码和类的部分来解决常见问题。这使得以下情况可以正常工作:
- 通过‘from xxx import foo’导入的函数和类在重新加载‘xxx’时会升级到新版本。
- 类的方法和属性在重新加载时也会升级,因此在重新加载之前创建的对象‘c’调用‘c.foo()’时,会执行新版本的‘foo’代码。
一些已知的注意事项包括:
- 替换代码对象并不总是成功:将类中的 @property 改为普通方法,或者将方法改为成员变量可能会导致问题(但只影响旧对象)。
- 在模块重新加载之前被移除的函数(例如通过猴子补丁)不会被升级。
- C 扩展模块无法重新加载,因此也不能自动重载。
来源: https://ipython.org/ipython-doc/3/config/extensions/autoreload.html#caveats
另一个不错的选择是将你的代码写在一个单独的脚本中,然后发送到 Django shell,像这样:
manage.py shell < my_script.py
1
试着使用内置的“reload”函数来重新加载你想要的模块。
http://docs.python.org/library/functions.html?highlight=reload#reload
7
我通过把模块从系统模块列表中移除,然后再重新导入来重新加载这个模块。
import sys
sys.modules.pop('your.module')
import your.module
# or
from your.module import your_function