6

我在 django IPython-shell 中工作,它可以从manage.py shell. 当我在 shell 中加载一个外部函数进行测试时,一切都很好。但是当我对函数进行更改时,shell 仍然具有旧版本的函数。即使我进行新的导入。

有谁知道如何重新加载函数的实际版本?

感谢问候!

编辑:我使用 Windows - 如果这有所作为。

4

5 回答 5

7

我通过从 sys.modules 中删除它重新加载模块并进行新的导入。

import sys
sys.modules.pop('your.module')
import your.module
# or
from your.module import your_function
于 2012-06-18T07:43:13.823 回答
1

尝试在所需模块上使用内置的“重新加载”功能。

http://docs.python.org/library/functions.html?highlight=reload#reload

于 2010-10-07T17:16:32.467 回答
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
于 2016-10-07T14:18:16.570 回答
0

我编写了一个脚本,它非常适合在 IPython 中重新加载模块。

它基于上面错误回答中的技术,您从 sys.modules 中删除模块然后重新导入它。

于 2012-07-15T00:31:31.803 回答
0

我发现的最简单的解决方案是 shell_plus 和 iPython 的组合,它会自动重新加载函数。

  1. 点安装 ipython
  2. pip install django-extensions
  3. 将“django_extensions”添加到您的 INSTALLED_APPS
  4. python manage.py shell_plus
于 2015-12-16T10:23:01.280 回答