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启动时如何运行任意代码?的主要内容,如果未能解决你的问题,请参考以下文章
如何实现在运行shell程序时添加选项-h能提示程序的用法?
使用 PostgreSQL (psycopg2) 和 Django 运行 Python 3.4 时出错