django,python:shell中的重载函数

时间:2010-10-07 16:12:42

标签: python django shell ipython

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

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

非常感谢!

编辑:我使用Windows - 如果这有所不同。

5 个答案:

答案 0 :(得分:6)

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

import sys
sys.modules.pop('your.module')
import your.module
# or
from your.module import your_function

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

在导入任何代码之前启用IPython自动加载扩展:

%load_ext autoreload
%autoreload 2

我将它与常规的django shell一起使用,虽然它确实有一些局限性,但它可以很好地工作:

<强>注意事项:

以可靠的方式重新加载Python模块通常很困难,并且可能会发生意外情况。 %autoreload尝试通过用新版本替换模块中先前的函数代码对象和类的部分来解决常见的陷阱。这使得以下工作成为可能:

  • 重新加载'xxx'时,通过'from xxx import foo'导入的函数和类将升级为新版本。
  • 类的方法和属性在重新加载时升级,因此在重新加载之前在对象'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

答案 3 :(得分:0)

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

它基于wrongite's answer above中的技术,您可以从sys.modules中删除该模块,然后重新导入该模块。

答案 4 :(得分:0)

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

  1. pip install ipython
  2. pip install django-extensions
  3. 添加&#39; django_extensions&#39;到您的INSTALLED_APPS
  4. python manage.py shell_plus