2010-10-07 15 views
5

Pracuję w powłoce IPython django, którą można uruchomić pod manage.py shell. Kiedy ładuję funkcję zewnętrzną w powłoce do testowania, wszystko jest w porządku. Ale kiedy dokonuję zmian w funkcji, powłoka nadal ma starą wersję funkcji. Nawet jeśli dokonam nowego importu.django, python: funkcja przeładowania w powłoce

Czy ktoś wie, jak załadować aktualną wersję funkcji?

Pozdrawiamy z poważaniem!

Edytuj: Używam okien - jeśli to robi różnicę.

+1

Funkcja przeładowania nie działa z django. Patrz: http://stackoverflow.com/questions/890924/how-do-you-reload-a-django-model-module-using-the-interactive-interpreter-via-ma – Hovis

Odpowiedz

5

I przeładować moduł o usunięcie go z tych sys.modules i zrobić nowy import.

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

Napisałem script że działa całkiem dobrze do przeładunku modułów ipython.

Opiera się na technice w wrongite's answer above, w której usuwa się moduł z sys.modules, a następnie ponownie go zaimportuje.

0

Najprostszym rozwiązaniem, jakie znalazłem, jest połączenie shell_plus i iPython, które automatycznie przeładowują funkcje.

  1. pip zainstalować ipython
  2. pip zainstalować Django rozszerzeń
  3. Dodaj 'django_extensions' do INSTALLED_APPS
  4. python manage.py shell_plus
+0

to nie przeładuj dla mnie. Python 2.6, 2.7, 3.4, 3.5, Django 1.6, 1.7, 1.8, 1.9, 1.10. Ofc z zainstalowanymi rozszerzeniami django. – Sassan

1

Włącz ipython rozszerzenie autoreload przed importem jakiegokolwiek kodu:

%load_ext autoreload 
%autoreload 2 

Używam go z regularną skorupy django i działa doskonale, choć ma pewne ograniczenia:

Ostrzeżenia:

moduły Przeładunek Python w wiarygodny sposób jest na ogół trudne i mogą wystąpić nieoczekiwane rzeczy . % autoreload próbuje obejść typowe pułapki, zastępując obiekty kodu funkcji i części klas poprzednio w module nowymi wersjami. To sprawia, że ​​następujące rzeczy działają:

  • Funkcje i klasy zaimportowane za pomocą "from xxx import foo" są uaktualniane do nowych wersji po przeładowaniu "xxx".
  • Metody i właściwości klas są uaktualniane przy ponownym ładowaniu, dzięki czemu wywołanie "c.foo()" na obiekcie "c" utworzonym przed przeładowaniem powoduje wykonanie nowego kodu dla "foo".

Niektóre ze znanych pozostałych zastrzeżeń są:

  • Wymiana obiektów kod nie zawsze uda: zmiana @property w klasie do zwykłej metody lub metoda zmiennej użytkownik może powodować problemy (ale tylko w starych obiektach).
  • Funkcje, które są usuwane (np. Przez łatanie małp) z modułu przed ponownym załadowaniem, nie są uaktualniane.
  • moduły rozszerzeń C nie mogą być przeładowane, a więc nie może być autoreloaded *

źródło:. https://ipython.org/ipython-doc/3/config/extensions/autoreload.html#caveats

Innym doskonałym rozwiązaniem jest napisanie kodu w osobnym skrypcie i wysłać go do django skorupę, jak to:

manage.py shell < my_script.py 
Powiązane problemy