繁体   English   中英

在`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几乎可以解决问题。 但是终端会关闭..如果有办法使其保持打开状态。

我也为此进行了斗争, < test.py关闭了外壳,并且shell_plus在自动加载模型的同时没有在此处添加太多内容,也不加载您要调试的代码

但是我可以这样做:如果不是从Django环境运行,我将创建一个test.py来初始化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

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

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

#!/bin/bash

export PYTHONSTARTUP="$1"      # 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. 

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

这不是一个直接的答案,但是Django扩展( GithubDocs )的shell_plus可能对此很有趣。 (该软件包有许多有用的工具,因此在许多情况下是很有价值的依赖项。)

该应用程序的模型会自动导入。 要配置其他导入,请参阅“ 其他导入”部分。

如果要使用shell_plus从任意python模块自动执行代码,则可以使用SHELL_PLUS_PRE_IMPORTSSHELL_PLUS_POST_IMPORTS设置。 在此配置的所有python模块都将在自动导入Django应用程序模型的a)之前或b)之后运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM