unknown - ¿Cómo iniciar django shell con ipython en modo qtconsole?
shell_plus django (8)
Desde la versión 1.4 de Django, el uso de django.core.management.setup_environ()
está en desuso. Una solución que funciona tanto para la notebook IPython como para la QTconsole es esta (solo ejecútela desde el directorio de su proyecto Django):
In [1]: from django.conf import settings
In [2]: from mydjangoproject.settings import DATABASES as MYDATABASES
In [3]: settings.configure(DATABASES=MYDATABASES)
Actualización: si trabaja con Django 1.7, también necesita ejecutar lo siguiente:
In [4]: import django; django.setup()
Con django.conf.settings.configure()
, especifica la configuración de la base de datos de su proyecto y luego puede acceder a todos sus modelos de la forma habitual.
Si desea automatizar estas importaciones, puede, por ejemplo, crear un perfil de IPython ejecutando:
ipython profile create mydjangoproject
Cada perfil contiene un directorio llamado startup
. Puede colocar scripts de Python arbitrarios allí y se ejecutarán justo después de que se inicie IPython. En este ejemplo, lo encuentras debajo de
~/.ipython/profile_<mydjangoproject>/startup/
Simplemente coloque un script allí que contenga el código que se muestra arriba, probablemente incluido en una cláusula try..except
para manejar ImportError
s. A continuación, puede iniciar IPython con el perfil dado de esta manera:
ipython qtconsole --profile=mydjangoproject
o
ipython notebook --profile=mydjangoproject
Cuando comienzo el shell django escribiendo python manage.py shell
ipython shell ipython . ¿Es posible hacer que Django inicie ipython en modo qtconsole ? (es decir, hacer que se ejecute ipython qtconsole
)
Arek
edición: así que estoy probando lo que Andrew Wilkinson sugirió en su respuesta: extender mi aplicación django con un comando que se basa en el comando shell original de django. Por lo que entiendo, el código que inicia ipython en la versión original es el siguiente:
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()
¿Algún consejo sobre cómo cambiar este código para iniciar ipython en modo qtconsole?
segunda edición: lo que encontré y funcionó hasta ahora es - inicia ''ipython qtconsole'' desde la ubicación donde está settings.py de mi proyecto (o configura sys.path si comienza desde una ubicación diferente), y luego ejecuta esto:
import settings
import django.core.management
django.core.management.setup_environ(settings)
y ahora puedo importar mis modelos, listar todas las instancias, etc.
He creado un script de shell con lo siguiente:
/path/to/ipython
qtconsole --pylab inline -c "run /path/to/my/site/shell.py"
Solo necesita la parte en --pylab inline
si desea los gráficos de matplotlib en línea geniales.
Y creé un script de python shell.py
en /path/to/my/site
con:
import os
working_dir = os.path.dirname(__file__)
os.chdir(working_dir)
import settings
import django.core.management
django.core.management.setup_environ(settings)
Al ejecutar mi script de shell, obtengo un ipython qtconsole con los beneficios del shell django.
Los documentos here dicen:
Si prefieres no usar manage.py, no hay problema. Simplemente configure la variable de entorno DJANGO_SETTINGS_MODULE en mysite.settings y ejecute python desde el mismo directorio en el que administra.py (o asegúrese de que ese directorio esté en la ruta de Python, para que funcione la importación de mysite).
Por lo tanto, debería ser suficiente para establecer esa variable de entorno y luego ejecutar ipython qtconsole
. Podría hacer un script simple para hacer esto por usted automáticamente.
Puede crear un comando que amplíe el comando de shell base e importe la aplicación IPythonQtConsoleApp así:
cree el archivo qtshell.py en su aplicación / administración / comandos con:
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()
entonces solo usa python manage.py qtshell
Puedes consultar el código que ejecuta el shell here . Verás que no hay dónde configurar qué shell se ejecuta.
Lo que podría hacer es copiar este archivo, renombrarlo como shell_qt.py y colocarlo en el directorio de administración / comandos de su propio proyecto. manage.py shell_qt
para ejecutar la consola QT y luego puede ejecutar manage.py shell_qt
.
Puedes instalar extensiones django y luego ejecutar
python manage.py shell_plus --ipython
También quería abrir el shell de Django en qtconsole. Mirando dentro de manage.py, solucione el problema por mí: Inicie IPython qtconsole, cd al directorio base del proyecto y ejecute:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
No olvide cambiar ''myproject'' al nombre de su proyecto.
Una característica un tanto no documentada de shell_plus
es la capacidad de ejecutarlo en "modo de solo kernel". Esto nos permite conectarnos desde otro shell, como un qtconsole en ejecución.
Por ejemplo, en un shell haz:
django-admin shell_plus --kernel
# or == ./manage.py shell_plus --kernel
Esto imprimirá algo como:
# Shell Plus imports ... ... To connect another client to this kernel, use: --existing kernel-23600.json
Luego, en otra ejecución de shell:
ipython qtconsole --existing kernel-23600.json
Esto ahora debería abrir un QtConsole. Otra sugerencia, en lugar de ejecutar otro shell, también puede presionar Ctrl + Z y ejecutar bg
para decirle al proceso actual que se ejecute en segundo plano.