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

时间:2015-01-01 16:39:32

标签: python django shell alias

有一个命令可以调用Django的shell:

python manage.py shell

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

  1. 开始python manage.py shell
  2. 执行print 'foo'
  3. 类似于-i选项的内容:python -i /usr/bin/print_foo.py,但manage.py shell

    这样做的原因是调试过程加快了速度。因此,我想在单独的PY文件中进行,而不是导入所有相关模型并分配变量。因此,每次我启动manage.py shell时,我都会掌握所有工具。

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

3 个答案:

答案 0 :(得分:2)

我也与此作斗争,< test.py关闭了shell,shell_plus除了自动加载模型之外没有增加太多,不加载你想要调试的代码

但是我可以这样做:如果没有从Django环境运行,我会创建一个初始化Django的test.py,并使用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(更快并保留上下文),con是你必须在shell打开时手动加载它

答案 1 :(得分:2)

您可以使用以下简单的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的更改不会影响shell中的环境。

答案 2 :(得分:1)

不是直接的答案,但Django Extensions(GithubDocsshell_plus可能对此感兴趣。 (该软件包有许多有用的工具,因此在许多情况下它是一种有价值的依赖。)

自动导入应用的模型。要配置进一步的导入,请参阅additional imports部分。

如果要使用shell_plus从任意python模块自动执行代码,可以使用SHELL_PLUS_PRE_IMPORTSSHELL_PLUS_POST_IMPORTS设置。任何在那里配置的python模块都会在自动导入Django的app模型之前或之后运行a)。