[英]Execute script after `python manage.py shell` is up
有一个调用Django shell的命令:
python manage.py shell
我想创建一个BASH别名,它将:
python manage.py shell
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.
只需提供要首先运行的python脚本作为脚本的第一个参数即可。 所有其他参数直接传递给manage.py
。 对$PYTHONSTARTUP
的更改不会影响您外壳中的环境。
这不是一个直接的答案,但是Django扩展( Github , Docs )的shell_plus
可能对此很有趣。 (该软件包有许多有用的工具,因此在许多情况下是很有价值的依赖项。)
该应用程序的模型会自动导入。 要配置其他导入,请参阅“ 其他导入”部分。
如果要使用shell_plus
从任意python模块自动执行代码,则可以使用SHELL_PLUS_PRE_IMPORTS
和SHELL_PLUS_POST_IMPORTS
设置。 在此配置的所有python模块都将在自动导入Django应用程序模型的a)之前或b)之后运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.