如何在django shell中重新加载模块?

14 浏览
0 Comments

如何在django shell中重新加载模块?

我一直在使用Django,并且经常使用Django shell。令人烦恼的是,当Django服务器在代码更改时重新加载时,shell并不会重新加载,所以每次我对正在测试的方法进行更改时,我都需要退出shell并重新启动它,重新导入我需要的所有模块,重新初始化我需要的所有变量等等。虽然iPython的历史记录可以节省很多打字,但这仍然很麻烦。有没有办法让django shell自动重新加载,就像django开发服务器一样?\n我知道reload()函数,但是我导入了很多模型,并且通常使用from app.models import *语法,所以reload()函数帮助不大。

0
0 Comments

问题的原因是在django shell中重新加载模块的方法不起作用。解决方法是使用django-extensions项目中的shell_plus管理命令,并在命令后添加--notebook参数。这将在web浏览器中打开一个IPython笔记本。在笔记本的一个单元格中编写代码和导入等,然后运行它。当修改模块时,只需点击笔记本菜单项的"Kernel->Restart"选项即可。这样,代码就会使用修改后的模块。虽然这种方法不像%autoreload那样自动,但比autoreload更可靠。通过重新启动内核,可以确保笔记本中的所有单元格都能完全重新加载模块。此外,还可以选择重新启动并运行所有单元格。

0
0 Comments

问题的原因是在Django shell中重新加载模块的方法。解决方法是将代码保存到文件中,然后使用命令"python manage.py shell < test.py"来重新加载模块,直到修复问题为止。为了更好地退出Django shell,可以在py文件的底部添加"exit()"命令。这是一个简单而优雅的解决方案。

0
0 Comments

问题的原因是在Django shell中重新加载模块的方法不清楚,解决方法是使用IPython的autoreload扩展。具体操作步骤如下:

1. 在终端中运行./manage.py shell命令进入Django shell。

2. 在Django shell中输入%load_ext autoreload命令加载autoreload扩展。

3. 输入%autoreload 2命令设置自动重新加载模块的策略。

4. 从现在开始,所有导入的模块在评估之前都会被刷新。

以下是一个例子:

In [1]: from x import print_something
In [2]: print_something()
Out[2]: 'Something'
# 在x.py文件中更改print_something方法的实现
In [3]: print_something()
Out[3]: 'Something else'

这种方法也适用于在%load_ext autoreload命令之前导入的模块。

还可以使用%aimport命令和3种autoreload策略来阻止某些模块的刷新。

- %autoreload: 自动重新加载所有模块(除了被%aimport排除的模块)。

- %autoreload 0: 禁用自动重新加载。

- %autoreload 1: 在每次执行输入的Python代码之前重新加载所有使用%aimport导入的模块。

- %autoreload 2: 在每次执行输入的Python代码之前重新加载所有模块(除了被%aimport排除的模块)。

可以使用%aimport命令列出要自动导入或不导入的模块,并使用%aimport foo%aimport -foo命令分别导入模块'foo'和将模块'foo'排除在自动重新加载之外。

这种方法通常适用于大多数情况,但也有一些注意事项:

- 替换代码对象并不总是成功的:将类中的方法更改为普通方法或将方法更改为成员变量可能会导致问题(但仅在旧对象中)。

- 在重新加载之前从模块中删除的函数(例如通过monkey-patching)不会被更新。

- 无法重新加载C扩展模块,因此无法进行自动重新加载。

如果使用Django的/manage.py shell_plus命令,可以在输入%load_ext autoreload%autoreload 2命令后自动重新加载模型。

需要注意的是,需要安装IPython才能使用这种方法。具体安装方法可以参考stackoverflow.com/a/47170195/50899。

至于在/manage.py shell_plus中如何自动化这个过程并使其成为默认行为,答案中并没有明确指出。

0