如何在qtconsole模式下使用ipython启动Django shell?

15
当我通过输入 python manage.py shell 启动django shell时,将启动ipython shell。是否可以让Django在qtconsole模式下启动ipython?(即使它运行ipython qtconsole
from django.core.management.base import NoArgsCommand

class Command(NoArgsCommand):
    requires_model_validation = False

    def handle_noargs(self, **options):
        from IPython.frontend.terminal.embed import TerminalInteractiveShell
        shell = TerminalInteractiveShell()
        shell.mainloop()

有什么建议可以将这段代码更改为在qtconsole模式下启动ipython吗?

第二次编辑: 我找到并且到目前为止可行的是-从我的项目的settings.py所在的位置开始启动'ipython qtconsole'(如果从不同位置启动,则设置sys.path),然后执行以下操作:

import settings
import django.core.management
django.core.management.setup_environ(settings)

现在我可以导入我的模型,列出所有的实例吗?


可能目前还没有简单的命令,但肯定可以让它工作。 - Thomas K
如果您将ipython别名为ipython qtconsole/usr/local/bin中,这对您是否可接受? - Unapiedra
@Unapiedra:我不认为那样会有效。 Django通过在Python级别导入并调用它来启动ipython,而不是使用shell命令。 - Thomas K
@Unapiedra: 你介意告诉我怎么做吗?我通常使用 .bashrc 来创建别名,不确定如何为文件创建别名。 - agend
@ThomasK:好的,我不确定它是如何做到的。 - Unapiedra
8个回答

7
文档在这里,内容如下:

如果您不想使用manage.py,没有问题。只需设置DJANGO_SETTINGS_MODULE环境变量为mysite.settings并从与manage.py相同的目录中运行python(或确保该目录在Python路径上,以便import mysite正常运行)。

因此,只需设置该环境变量,然后运行ipython qtconsole即可。您可以编写一个简单的脚本来自动完成此操作。

你需要将Django项目的位置添加到路径中,同时仍然需要解决Django设置的一些问题——当我想要列出模型中的所有对象时,它会说我没有设置数据库引擎。 - agend

4
我创建了一个包含以下内容的Shell脚本:
/path/to/ipython
qtconsole --pylab inline -c "run /path/to/my/site/shell.py"

如果您想要酷炫的内联 matplotlib 图表,只需要使用 --pylab inline 部分。

我在 /path/to/my/site 中创建了一个名为 shell.py 的 Python 脚本:

import os
working_dir = os.path.dirname(__file__)
os.chdir(working_dir)
import settings
import django.core.management
django.core.management.setup_environ(settings)

运行我的shell脚本会打开一个IPython Qt控制台,具有Django shell的优点。

在安装了新的ipython之后,这个功能对我不再起作用了。似乎ipython qtconsole不再支持-c标志了。我已经切换到Thomas K的答案。 - RickG

2

我该如何更改代码以在qt控制台中运行 - 你能帮我吗? - agend

1

自Django 1.4版本起,django.core.management.setup_environ()的使用已被弃用。适用于IPython笔记本和QTconsole的解决方案是这样的(只需在Django项目目录中执行此操作):

In [1]: from django.conf import settings

In [2]: from mydjangoproject.settings import DATABASES as MYDATABASES

In [3]: settings.configure(DATABASES=MYDATABASES)

更新:如果您使用的是Django 1.7,您还需要执行以下操作:

In [4]: import django; django.setup()

使用django.conf.settings.configure(),您可以指定项目的数据库设置,然后以通常的方式访问所有模型。

如果您想自动化这些导入操作,您可以创建一个IPython配置文件,方法是运行:

ipython profile create mydjangoproject

每个配置文件都包含一个名为startup的目录。您可以在其中放置任意Python脚本,它们将在IPython启动后立即执行。在此示例中,您可以在以下位置找到它:

~/.ipython/profile_<mydjangoproject>/startup/

在其中放置一个脚本,其中包含上面显示的代码,可能由try..except子句括起来以处理ImportError。然后,您可以像这样使用给定配置文件启动IPython:

ipython qtconsole --profile=mydjangoproject

或者

ipython notebook --profile=mydjangoproject

0
shell_plus的一个不太被记录的功能是能够以“仅内核模式”运行它。这使我们可以从另一个shell连接到它,例如运行qtconsole的shell。
例如,在一个shell中执行以下操作:
django-admin shell_plus --kernel
# or == ./manage.py shell_plus --kernel

这将会打印出类似于:

# Shell Plus imports ...
...

To connect another client to this kernel, use:
   --existing kernel-23600.json

然后,在另一个终端中运行:

ipython qtconsole --existing kernel-23600.json

现在应该会打开一个QtConsole。另一个提示是,你可以按下Ctrl+Z,而不是运行另一个shell,然后运行bg告诉当前进程在后台运行。


0
您可以创建一个命令,扩展基本的shell命令,并像下面这样导入IPythonQtConsoleApp:
在yourapp/management/commands中创建文件qtshell.py:
from django.core.management.commands import shell

class Command(shell.Command):
    def _ipython(self):
        """Start IPython Qt console"""
        from IPython.qt.console.qtconsoleapp import IPythonQtConsoleApp
        app = IPythonQtConsoleApp.instance()
        app.initialize(argv=[])
        app.start()

然后只需使用python manage.py qtshell


0

我也想在qtconsole中打开Django shell。查看manage.py文件后,问题得到了解决: 启动IPython qtconsole,进入项目基础目录并运行:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

别忘了将“myproject”更改为您的项目名称。


-1

您可以安装Django扩展,然后运行

python manage.py shell_plus --ipython

3
这个命令只是在终端中预加载了所有模块,而不是以qtconsole模式启动IPython。所以这不是这个问题的正确答案。 - pemistahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接