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

时间:2011-11-23 12:21:00

标签: python django shell ipython

当我通过键入python manage.py shell启动django shell时 ipython shell已启动。是否有可能让Django以qtconsole模式启动ipython? (即让它运行ipython qtconsole

Arek

编辑: 所以我正在尝试Andrew Wilkinson在他的回答中提出的建议 - 使用基于原始django shell命令的命令扩展我的django应用程序。据我所知,在原始版本中启动ipython的代码是:

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)

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

8 个答案:

答案 0 :(得分:7)

文档here说:

  

如果你不想使用manage.py,没问题。只需设置   DJANGO_SETTINGS_MODULE环境变量到mysite.settings并运行   来自同一目录manage.py的python(或确保   目录在Python路径上,因此导入mysite有效。)

因此,设置该环境变量然后运行ipython qtconsole就足够了。您可以制作一个简单的脚本来自动为您执行此操作。

答案 1 :(得分:4)

我使用以下内容创建了一个shell脚本:

/path/to/ipython
qtconsole --pylab inline -c "run /path/to/my/site/shell.py"

如果你想要酷的内联matplotlib图,你只需要--pylab inline部分。

我在shell.py创建了一个python脚本/path/to/my/site,其中包含:

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 qtconsole,它具有django shell的优点。

答案 2 :(得分:2)

您可以检查运行shell here的代码。您将看到没有配置shell运行的位置。

您可以做的是复制此文件,将其重命名为shell_qt.py并将其放在您自己项目的管理/命令目录中。更改它以运行QT控制台,然后您可以运行manage.py shell_qt

答案 3 :(得分: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

答案 4 :(得分:0)

您可以安装django extensions,然后运行

python manage.py shell_plus --ipython

答案 5 :(得分:0)

我还想在qtconsole中打开Django shell。看看manage.py里面为我解决了这个问题: 启动IPython qtconsole,cd到项目基目录并运行:

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

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

答案 6 :(得分:0)

您可以创建一个扩展base shell命令的命令,并像这样导入IPythonQtConsoleApp:

使用以下命令在yourapp / management /命令中创建文件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

答案 7 :(得分:0)

shell_plus的一个未记录的功能是可以在“仅内核模式”下运行它。这使我们可以从另一个外壳(例如运行qtconsole的外壳)连接到它。

例如,在一个外壳中执行:

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

然后,在另一个shell中运行:

ipython qtconsole --existing kernel-23600.json

现在应该打开QtConsole。另一个提示,除了运行另一个shell外,您还可以按 Ctrl + Z ,然后运行bg告诉当前进程在后台运行。