2010-10-07 19 views
5

我在django IPython-shell中工作,它可以用manage.py shell开头。 当我在shell中加载extern函数进行测试时,一切都很好。但是,当我对该功能进行更改时,外壳仍然具有旧版本的功能。即使我做了一个新的进口。django,python:在shell中重载函数

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

谢谢!

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

+1

重载功能将不会与django一起使用。 请参阅:http://stackoverflow.com/questions/890924/how-do-you-reload-a-django-model-module-using-the-interactive-interpreter-via-ma – Hovis 2011-08-23 01:36:43

回答

5

我重装通过它从这个sys.modules中删除,并作出新的导入模块。

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

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

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

0

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

  1. PIP安装IPython中
  2. PIP安装Django的扩展
  3. 添加 'django_extensions' 你INSTALLED_APPS
  4. 蟒蛇manage.py shell_plus
+0

它不为我重新加载。 Python 2.6,2.7,3.4,3.5,Django 1.6,1.7,1.8,1.9,1.10。 Ofc与django扩展安装。 – Sassan 2016-09-27 18:15:04

1

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

%load_ext autoreload 
%autoreload 2 

我与常规的Django shell中使用它和它的作品完美,但它确实有一些限制:

注意事项:

以可靠的方式重新加载Python模块是在一般的困难,可能会出现意想不到的事情。 %autoreload试图通过用新版本替换模块中以前的函数代码对象和类的一部分来解决常见的陷阱。这使得以下事情起作用:

  • 当'xxx'重新加载时,通过'from xxx import foo'导入的函数和类会升级到新版本。
  • 类的方法和属性在重载时升级,因此在重载之前创建的对象'c'上调用'c.foo()'会导致执行'foo'的新代码。

一些已知的其余警告的是:

  • 更换代码对象并不总是成功:改变一个类中的@property向一个成员变量的普通方法或方法可能会导致问题(但仅限于旧物体)。
  • 在重新加载之前从模块中删除的函数(例如,通过monkey-patching)不会升级。
  • C扩展模块不能重新加载,所以不能autoreloaded *

来源:https://ipython.org/ipython-doc/3/config/extensions/autoreload.html#caveats

另一个伟大的选择是编写你的代码在一个单独的脚本,并将其发送给Django的壳,就像这个:

manage.py shell < my_script.py