2010-10-07 15 views
5

Io lavoro nella shell IPython django, che può essere avviata con manage.py shell. Quando carico una funzione extern nella shell per il test, tutto va bene. Ma quando apporto modifiche alla funzione, la shell ha ancora la vecchia versione della funzione. Anche se faccio una nuova importazione.django, python: ricarica la funzione nella shell

Qualcuno sa come ricaricare la versione effettiva della funzione?

Grazie in merito!

Modifica: Io uso Windows, se questo fa la differenza.

+1

La funzione di ricarica non funziona con django. Vedere: http://stackoverflow.com/questions/890924/how-do-you-reload-a-django-model-module-using-the-interactive-interpreter-via-ma – Hovis

risposta

5

ho ricaricare il modulo per rimuoverlo dal le sys.modules e fare una nuova importazione.

import sys 
sys.modules.pop('your.module') 
import your.module 
# or 
from your.module import your_function 
0

ho scritto un script che funziona abbastanza bene per ricaricare i moduli in IPython.

Si basa sulla tecnica in wrongite's answer above in cui si rimuove il modulo da sys.modules quindi lo si reimporta.

0

La soluzione più semplice che ho trovato è la combinazione di shell_plus e iPython che ricarica automaticamente le funzioni.

  1. pip installare ipython
  2. pip installare django-extensions
  3. Aggiungi 'django_extensions' al vostro INSTALLED_APPS
  4. pitone manage.py shell_plus
+0

Non funziona ricarica per me. Python 2.6, 2.7, 3.4, 3.5, Django 1.6, 1.7, 1.8, 1.9, 1.10. Ofc con estensioni django installate. – Sassan

1

Abilita IPython estensione autoreload prima di importare qualsiasi codice:

%load_ext autoreload 
%autoreload 2 

lo uso con il guscio Django regolare e funziona perfettamente, anche se ha alcune limitazioni:

Avvertenze:

moduli ricaricamento Python in modo affidabile è in generale difficile, e possono verificarsi cose inaspettate . % autoreload tenta di aggirare le insidie ​​più comuni sostituendo gli oggetti del codice funzione e parti di classi precedentemente nel modulo con nuove versioni. Questo fa funzionare le cose seguenti:

  • Le funzioni e le classi importate tramite 'da xxx import foo' vengono aggiornate alle nuove versioni quando 'xxx' viene ricaricato.
  • I metodi e le proprietà delle classi vengono aggiornati al momento del caricamento, in modo che la chiamata 'c.foo()' su un oggetto 'c' creato prima del ricaricamento causi l'esecuzione del nuovo codice per 'pippo'.

Alcuni dei noti avvertimenti rimanenti sono:

  • Sostituzione oggetti di codice non sempre riesce: cambiare una @property in una classe per un metodo ordinario o di un metodo per una variabile membro può causare problemi (ma solo in vecchi oggetti).
  • Le funzioni rimosse (ad esempio tramite patch di scimmia) da un modulo prima di essere ricaricate non vengono aggiornate.
  • moduli di estensione C non possono essere ricaricati, e quindi non possono essere autoreloaded *

fonte:. https://ipython.org/ipython-doc/3/config/extensions/autoreload.html#caveats

Un altro grande opzione è quella di scrivere il codice in uno script separato e inviarlo a Django shell, come this:

manage.py shell < my_script.py 
Problemi correlati