2010-09-22 17 views
56

Estoy trabajando con Django y uso el shell Django todo el tiempo. La parte molesta es que mientras el servidor de Django se recarga en los cambios de código, el shell no lo hace, así que cada vez que hago un cambio en un método que estoy probando, necesito salir del shell y reiniciarlo, volver a importar todos los módulos que Necesito, reiniciar todas las variables que necesito, etc. Mientras que el historial de iPython ahorra mucho tipeo en esto, esto sigue siendo un problema. ¿Hay alguna manera de hacer que django shell recargue automáticamente, de la misma manera que lo hace el servidor de desarrollo django?¿Cómo volver a cargar los módulos en django shell?

Sé acerca de reload(), pero importo muchos modelos y generalmente uso la sintaxis from app.models import *, así que recargar() no es de mucha ayuda.

+2

Debe actualizar esta pregunta para marcar correctamente la respuesta "django-extensions". – woodardj

+0

No hasta que realmente funcione para mí. Tengo las extensiones instaladas y ninguno de mis códigos se recarga automáticamente y no veo ninguna mención de auto-recarga en los documentos shell_plus. Parece que hay un recargador en el comando runserver_plus, pero eso no es lo que estoy buscando. –

Respuesta

22

Recomiendo usar el proyecto django-extensions como se indicó anteriormente mediante dongweiming. Pero en vez de comando '' shell_plus manejo, uso:

manage.py shell_plus --notebook 

Esto abrirá un cuaderno IPython en su navegador web. Escriba su código allí en una celda, sus importaciones, etc. y ejecútelo.

Al cambiar sus módulos, simplemente haga clic en el elemento de menú portátil 'kernel> Reiniciar'

Hay que ir, su código ahora está utilizando sus módulos modificados.

+6

"Simplemente use un cuaderno de Python" no es una respuesta al Pregunta de OP –

+0

Este método, aunque no es automático como% autoreload, funciona de manera más confiable que la autorecarga. Kernel restart garantiza que todas las celdas del notebook obtengan módulos completamente recargados. Además, puede reiniciar y ejecutar todas las celdas si lo desea. –

23

Parece que el consenso general sobre este tema, es que recarga pitón() chupa y no hay una buena manera de hacer esto.

+0

Incorrecto. La respuesta de @dongweiming anterior es la solución, y debe aceptarse como la mejor respuesta. – velotron

+2

Múltiples comentarios sobre su respuesta dicen que shell_plus no recarga los modelos –

+1

. Acabo de probarlo yo mismo y no se recarga. Además, ¿qué pasa con el código que no es modelo y que importo a mano? –

42

observe el comando manage.py shell_plus provisto por el proyecto django-extensions. Cargará todos sus archivos de modelo en el inicio del shell. y recargar automáticamente cualquier modificación pero no necesita salir, puede llamar directamente allí

+2

Esta pregunta debe actualizarse para marcar esta la respuesta. – woodardj

+27

Uso shell_plus y mis modelos no se vuelven a cargar automáticamente, ¿me falta algo? –

+0

¿Funciona esto en Windows? Parece que no se recarga automáticamente – Pureferret

1

En lugar de ejecutar comandos desde el shell Django, puede configurar un comando de administración like so y volver a ejecutarlo cada vez.

0

No es exactamente lo que quiere, pero ahora tiendo a construirme comandos de administración para probar y manipular cosas.

En el comando puede configurar un grupo de locales de la manera que desee y luego colocar en un shell interactivo.

import code 

class Command(BaseCommand): 
    def handle(self, *args, **kwargs): 
    foo = 'bar' 
    code.interact(local=locals()) 

No se permite la recarga, pero es una manera fácil y menos molesta de probar interactivamente la funcionalidad django.

21

Mi solución a ella es que escribo el código y guardar en un archivo y luego usar:

python manage.py shell < test.py

Así que puedo hacer el cambio, Guarde y ejecute ese comando nuevamente hasta que arregle lo que sea que esté tratando de arreglar.

+1

Agradable y simple. Una nota, agrega '' 'exit()' '' a la parte inferior del archivo py para salir del shell de Django de una manera más limpia. Gracias. –

2

Mi solución para este inconveniente es la siguiente. Estoy usando IPython.

$ ./manage.py shell 
> import myapp.models as mdls # 'mdls' or whatever you want, but short... 
> mdls.SomeModel.objects.get(pk=100) 
> # At this point save some changes in the model 
> reload(mdls) 
> mdls.SomeModel.objects.get(pk=100) 

Espero que ayude.Por supuesto, es para depuración.

Saludos.

19

Sugeriría usar IPython autoreload extension.

./manage.py shell 

In [1]: %load_ext autoreload 
In [2]: %autoreload 2 

Y a partir de ahora todos los módulos importados se actualizarán antes de la evaluación.

In [3]: from x import print_something 
In [4]: print_something() 
Out[4]: 'Something' 

# Do changes in print_something method in x.py file. 

In [5]: print_something() 
Out[5]: 'Something else' 

Works también si algo se ha importado antes %load_ext autoreload comando.

./manage.py shell 
In [1]: from x import print_something 
In [2]: print_something() 
Out[2]: 'Something' 

# Do changes in print_something method in x.py file. 

In [3]: %load_ext autoreload 
In [4]: %autoreload 2 
In [5]: print_something() 
Out[5]: 'Something else' 

No es posible también a prevenir algunas importaciones desde refrescante con %aimport de mando y 3 autoreload estrategias:

% autoreload

  • Actualizar todos los módulos (excepto los excluidos por% aimport) automáticamente ahora.

% autoreload 0

  • de carga automática Desactivar.

% autoreload 1

  • Actualizar todos los módulos importados con aimport% cada vez que antes de ejecutar el código Python mecanografiado.

% autoreload 2

  • Actualizar todos los módulos (excepto los excluidos por aimport%) cada vez que antes de ejecutar el código Python escrito.

% módulos aimport

  • lista en la que se van a importar de forma automática o no ser importados.

% aimport foo

  • importación de módulo 'foo' y se marca para ser autoreloaded para% autoreload 1

% -foo aimport

  • Marque el módulo 'foo' para que no se recargue automáticamente.

En general, esto funciona bien para mi uso, pero hay algunas cavetas:

  • Sustitución de objetos de código no siempre tienen éxito: el cambio de un @property en una clase con un método ordinario o un método para una variable miembro puede causar problemas (pero solo en objetos antiguos).
  • Las funciones que se eliminan (por ejemplo, a través de parche de monos) desde un módulo antes de volver a cargarlas no se actualizan.
  • Los módulos de extensión C no se pueden volver a cargar y, por lo tanto, no se pueden volver a cargar automáticamente.
Cuestiones relacionadas