【问题标题】:django, python: reload function in shelldjango,python:在 shell 中重新加载函数
【发布时间】:2011-04-22 11:14:25
【问题描述】:

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

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

谢谢!

编辑:我使用 windows - 如果这有影响的话。

【问题讨论】:

标签: python django shell ipython


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 链接失效,该页面没有重新加载功能。
    【解决方案3】:

    在导入任何代码之前启用 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
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        1. 点安装 ipython
        2. pip install django-extensions
        3. 将“django_extensions”添加到您的 INSTALLED_APPS
        4. python manage.py shell_plus

        【讨论】:

        • 它不会为我重新加载。 Python 2.6、2.7、3.4、3.5、Django 1.6、1.7、1.8、1.9、1.10。安装了 django 扩展的 Ofc。
        猜你喜欢
        • 2011-04-15
        • 2018-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 2018-10-10
        • 2020-03-08
        相关资源
        最近更新 更多