【问题标题】:How to run arbitrary code when django shell starts?django shell启动时如何运行任意代码?
【发布时间】: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 时运行的文件。

【问题讨论】:

    标签: python django debugging django-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

        【讨论】:

          猜你喜欢
          • 2011-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-12
          • 2021-08-08
          • 2023-02-06
          相关资源
          最近更新 更多