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

Posted

技术标签:

【中文标题】django shell启动时如何运行任意代码?【英文标题】:How to run arbitrary code when django shell starts? 【发布时间】:2012-07-15 00:23:47 【问题描述】:

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

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

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

只会运行脚本,就好像您在 shell 启动时输入了整个内容一样。

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

我认为 ipython 应该有一种方法来运行脚本,然后将其 locals() 导入***命名空间。在这种情况下,您只需执行%magic script.py,我们只需一步,这很好。

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

【问题讨论】:

【参考方案1】:

您可以像shell_plus 所做的那样创建自己的自定义命令:查看shell_plus 命令的source 以了解如何操作。在该代码中,您可以指定并运行需要在启动 shell 之前执行的文件。 Django 在creating custom commands 上的文档也很有用。

【讨论】:

【参考方案2】:

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

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

从该命令的源代码中,我看到它尊重 PYTHONSTARTUP 环境变量。

【讨论】:

问题是我可能不希望它在所有 shell 上运行 - 我将 ipython 用于 django 以外的东西!而 shell_plus 只加载模型。【参考方案3】:

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代码就会被加载。

【讨论】:

【参考方案4】:

不确定是否有可以使用的标志,但如果你安装了 ipython,它应该很简单:

ipython

那么当你在提示符中时:

run script.py

然后:

run manage.py shell

【讨论】:

以上是关于django shell启动时如何运行任意代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在django渠道服务器启动时一次运行代码?

仅在 Django 启动 ONCE 时执行代码?

如何实现在运行shell程序时添加选项-h能提示程序的用法?

使用 PostgreSQL (psycopg2) 和 Django 运行 Python 3.4 时出错

如何在Visual Studio Code中使用django shell调试django(逻辑)代码

共享一个防止脚本重复启动的shell脚本