127 Stimmen

Wie lädt man Module in der Django-Shell neu?

Ich arbeite mit Django und benutze die Django-Shell ständig. Der lästige Teil ist, dass während der Django-Server auf Code-Änderungen neu geladen wird, die Shell nicht, so dass jedes Mal, wenn ich eine Änderung an einer Methode, die ich teste, muss ich die Shell beenden und neu starten, re-importieren alle Module, die ich brauche, reinitialisieren alle Variablen, die ich brauche usw. Die iPython-Historie erspart mir zwar eine Menge Tipparbeit, aber das ist immer noch ein Problem. Gibt es eine Möglichkeit, die django shell automatisch neu zu laden, so wie es der django development server tut?

Ich weiß über reload() Bescheid, aber ich importiere viele Modelle und verwende im Allgemeinen from app.models import * Syntax, daher ist reload() keine große Hilfe.

2 Stimmen

Sie sollten diese Frage aktualisieren und die Antwort "django-extensions" als richtig markieren.

1 Stimmen

Erst wenn es für mich tatsächlich funktioniert. Ich habe die Erweiterungen installiert, aber keiner meiner Codes wird automatisch neu geladen, und in den shell_plus-Dokumenten wird das automatische Laden nicht erwähnt. Es scheint, dass es einen Reloader im runserver_plus-Befehl gibt, aber das ist nicht das, wonach ich suche.

128voto

Paweł BB Drozd Punkte 3737

Ich würde vorschlagen, IPython zu verwenden Autoreload-Erweiterung .

./manage.py shell

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

Und von nun an werden alle importierten Module vor der Auswertung aufgefrischt.

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'

Funktioniert auch, wenn vorher etwas importiert wurde %load_ext autoreload Befehl.

./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'

Es ist auch möglich, einige Importe an der Auffrischung mit %aimport Befehl und 3 Strategien zum automatischen Laden:

%Auto-Laden

  • Alle Module (außer denen, die durch %aimport ausgeschlossen wurden) automatisch neu laden jetzt.

%Auto-Laden 0

  • Deaktivieren Sie das automatische Nachladen.

%Auto-Laden 1

  • Laden Sie alle mit %aimport importierten Module jedes Mal neu, bevor Sie die den getippten Python-Code ausführt.

%Auto-Laden 2

  • Alle Module (außer denen, die durch %aimport ausgeschlossen wurden) werden jedes Mal neu geladen bevor der eingegebene Python-Code ausgeführt wird.

%aimport

  • Auflistung der Module, die automatisch importiert werden sollen bzw. nicht importiert werden sollen importiert werden sollen.

%aimport foo

  • Modul 'foo' importieren und für %autoreload 1 zum automatischen Laden markieren

%aimport -foo

  • Markieren Sie das Modul 'foo', damit es nicht automatisch geladen wird.

Für meine Zwecke funktioniert das im Allgemeinen gut, aber es gibt einige Einschränkungen:

  • Das Ersetzen von Code-Objekten ist nicht immer erfolgreich: Das Ändern einer @Eigenschaft in einer Klasse in eine gewöhnliche Methode oder einer Methode in eine Mitgliedsvariable kann Probleme verursachen (allerdings nur in alten Objekten).
  • Funktionen, die (z.B. über monkey-Parcheando) aus einem Modul entfernt werden, bevor es neu geladen wird, werden nicht aktualisiert.
  • C-Erweiterungsmodule können nicht nachgeladen werden und können daher auch nicht automatisch geladen werden.

4 Stimmen

Für den Fall, dass Sie das django /manage.py shell_plus ... wenn Sie eingeben %load_ext autoreload und dann %autoreload 2 werden die Modelle automatisch neu geladen.

0 Stimmen

Erstaunlich, Sie haben meinen Tag gerettet

0 Stimmen

Beachten Sie, dass Sie dafür natürlich ipython installiert haben müssen. Siehe z.B. stackoverflow.com/a/47170195/50899

56voto

Erik Punkte 742

Meine Lösung ist, dass ich den Code schreibe und in einer Datei speichere und dann verwende:

python manage.py shell < test.py

So kann ich die Änderung vornehmen, speichern und den Befehl erneut ausführen, bis ich das Problem behoben habe, das ich zu beheben versuche.

5 Stimmen

Schön und einfach. Eine Anmerkung, hinzufügen exit() am Ende der py-Datei, um die Django-Shell sauberer zu beenden. Vielen Dank.

0 Stimmen

Eine einfache und elegante Lösung. Gute Arbeit.

46voto

mpaf Punkte 6143

Ich empfehle die Verwendung des django-extensions-Projekts, wie oben von dongweiming angegeben. Aber anstelle des Verwaltungsbefehls "shell_plus", verwenden Sie:

manage.py shell_plus --notebook

Dadurch wird ein IPython-Notizbuch in Ihrem Webbrowser geöffnet. Schreiben Sie dort Ihren Code in eine Zelle, Ihre Importe usw. und führen Sie ihn aus.

Wenn Sie Ihre Module ändern, klicken Sie einfach auf den Notebook-Menüpunkt 'Kernel->Neustart'.

Das war's. Ihr Code verwendet nun Ihre geänderten Module.

43 Stimmen

"Verwenden Sie einfach ein Python-Notebook" ist keine Antwort auf die Frage des Auftraggebers.

1 Stimmen

Diese Methode ist zwar nicht automatisch wie %autoreload, funktioniert aber zuverlässiger als autoreload. kernel restart garantiert, dass alle Zellen im Notebook vollständig neu geladene Module erhalten. Außerdem können Sie alle Zellen neu starten und ausführen, wenn Sie möchten.

32voto

dongweiming Punkte 815

Sehen Sie sich den Befehl manage.py shell_plus an, der von der django-erweiterungen Projekt. Es lädt alle Ihre Modelldateien beim Start der Shell und lädt automatisch alle Änderungen, aber Sie brauchen keinen Exit, Sie können es direkt aufrufen

44 Stimmen

Ich verwende shell_plus und meine Modelle werden nicht automatisch nachgeladen, übersehe ich etwas?

40 Stimmen

Shell_plus lädt keine Modelle nach, so dass dies keine Antwort auf die Frage ist.

6 Stimmen

Wie gesagt, Shell_plus lädt keine Modelle nach.

27voto

Mad Wombat Punkte 13534

Es scheint, dass der allgemeine Konsens zu diesem Thema, ist, dass Python reload() saugt und es gibt keine gute Möglichkeit, dies zu tun.

0 Stimmen

Falsch. Die obige Antwort von @dongweiming ist die Lösung und sollte als die beste Antwort akzeptiert werden.

3 Stimmen

Mehrere Kommentare zu seiner Antwort besagen, dass shell_plus die Modelle nicht nachlädt

1 Stimmen

Ich habe es gerade selbst getestet und es lädt nicht nach. Außerdem, was ist mit Nicht-Modell-Code, den ich von Hand importiere?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X