如何在django shell启动时运行任意代码?

问题描述:

这个问题:Automatically import models on Django shell launch有解释如何通过使用shell_plus开始导入模型,但没有答案关于如何运行一般的代码。如何在django shell启动时运行任意代码?

但是,有没有简单的方法来运行一个python脚本?

python manage.py shell [or shell_plus] --run=script.py 

只是运行脚本,就好像在shell启动时键入整个内容一样。

我意识到你可以在shell中导入东西,但是它们被困在命名空间中。

我认为ipython应该有一种方法来运行脚本,然后将它的locals()导入到*命名空间。在这种情况下,你可以做%magic script.py,我们只需要一步,这会很好。

更改启动shell的方式应该没问题 - 主要目标是只能创建在启动shell时运行的文件。

不知道如果有,你可以使用一个标志,但如果你有IPython的安装应该是这么简单:

ipython

然后,当你在提示:

run script.py

然后:

run manage.py shell

您可以创建自己的自定义命令,就像shell_plus已完成的操作:请参阅shell_plus命令的source以查看方式。在该代码中,您可以指定并运行在启动shell之前需要执行的文件。 Django的文档creating custom commands也很有用。

您可以尝试使用环境变量PYTHONSTARTUP。 另请尝试django-extensions:django-extensions

请参阅django-extensions/management/commands/shell_plus.py命令。

从这个命令的源代码,我看到它尊重PYTHONSTARTUP env变量。

+0

问题是我可能不希望它运行所有shell - 我使用ipython除了django以外的东西!而shell_plus只加载模型。 – fastmultiplication 2012-07-17 03:17:08

shell_plus使用IPython的一种有限形式,它不会处理其启动&配置,这会破坏在django + ipython shell启动时运行事物的大多数正常尝试。您可以将其切换为使用可以解决大多数问题的完整版本。

修改django_extensions/management/commands/shell_plus。PY

删除:

embed(user_ns=imported_objects) 

,取而代之的是:

from IPython import start_ipython 
start_ipython(argv=[], user_ns=imported_objects) 

然后在启动目录中的Python代码会被加载。