debugging 如何在django shell启动时运行任意代码?

dluptydi  于 2023-01-13  发布在  Go
关注(0)|答案(5)|浏览(146)

这个问题: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启动时运行的文件。

to94eoyn

to94eoyn1#

您可以像shell_plus一样创建自己的自定义命令:参见shell_plus命令的source来了解如何操作。在该代码中,您可以指定并运行在启动shell之前需要执行的文件。Django关于creating custom commands的文档也很有用。

ohfgkhjo

ohfgkhjo2#

你可以尝试使用环境变量PYTHONSTARTUP,也可以试试django-extensions:django-extensions
请参见django-extensions/管理/命令/shell_plus.py命令。
从这个命令的源代码我看到它尊重PYTHONSTARTUP环境变量。

pvcm50d1

pvcm50d13#

shell_plus使用了一种受限的IPython,它不处理启动和配置,这使得大多数在django+ipython shell启动时运行的正常尝试都失败了。你可以切换到使用完整版本,这将解决大多数问题。

修改django扩展/管理/命令/shell_plus.py

移除:

embed(user_ns=imported_objects)

并将其替换为:

from IPython import start_ipython
start_ipython(argv=[], user_ns=imported_objects)

然后启动目录中的python代码将被加载。

4szc88ey

4szc88ey4#

不确定是否有可以使用的标志,但如果安装了ipython,它应该像下面这样简单:
ipython
然后当你在提示符中:
run script.py
然后:
run manage.py shell

uplii1fm

uplii1fm5#

似乎最简单的方法是运行cat myscript.py | awx-manage shell
有关参考,请访问https://github.com/ansible/awx-operator/blob/7d2d1b3c5e3766966bfec0f9f58037f654b93b59/roles/installer/tasks/initialize_django.yml#L21-L24

相关问题