在 `python manage.py shell` 启动后执行脚本

Execute script after `python manage.py shell` is up

有调用Django shell的命令:

python manage.py shell

我想创建一个 BASH 别名,它将:

  1. 开始python manage.py shell
  2. 执行print 'foo'

类似于 -i 选项的内容:python -i /usr/bin/print_foo.py 但带有 manage.py shell

这样做的原因是太加快了调试过程。因此,我不想导入所有相关模型并分配变量,而是想在单独的 PY 文件中进行。所以每次我开始manage.py shell,我都会把所有的工具都放在手边。

编辑:使用python manage.py shell < /usr/bin/print_foo.py几乎可以解决问题。但是终端会关闭..如果有办法让它保持打开状态。

不是直接的答案,而是 Django Extensions(Github, Docs) shell_plus 可能对此很有趣。(这个包有很多有用的工具,所以在很多情况下它是一个有价值的依赖项。)

应用的模型是自动导入的。要配置更多导入,请参阅 additional imports 部分。

如果你想使用 shell_plus 自动执行来自任意 python 个模块的代码,你可以使用 SHELL_PLUS_PRE_IMPORTSSHELL_PLUS_POST_IMPORTS 设置。在 Django 的应用程序模型自动导入之前或 b) 之后配置的任何 python 模块 运行 a) 之后。

我也遇到过这个问题,< test.py 关闭了 shell,并且 shell_plus 除了模型的自动加载之外没有添加太多,没有加载代码你想调试

但是我可以这样做:我制作了一个 test.py 如果它不是来自 Django 环境的 运行,它会初始化 Django,并且 运行 它与 python -i test.py 基本思想是不使用 manage.py shell

if __name__ == '__main__':
    # This will run e.g. from python -i test.py, but will be skipped if from Django
    import django  # 1.7
    import os
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
    django.setup()

# Your regular Django stuff here


# Init your vars etc and prepare values to debug
# The Python prompt will remain active here so you can work on it

另一个自动化程度较低的解决方案是调用 execfile('test.py')%run test.py 如果您在 IPython, 优点是您可以在不离开 shell 的情况下重新加载 test.py 模块(更快并保留上下文),缺点是您必须在 shell 打开时手动加载它

您可以使用以下简单的 shell 脚本:

#!/bin/bash

export PYTHONSTARTUP=""      # Set the startup script python will run when it start.
shift                          # Remove the first argument, don't want to pass that.
python manage.py shell "$@"    # Run manage.py with the startup script. 

只需首先提供您想要 运行 的 python 脚本作为脚本的第一个参数。所有其他参数直接传递给 manage.py。对 $PYTHONSTARTUP 的更改不会影响 shell 中的环境。