NameError: Der Name 'reload' ist nicht definiert

78

Ich benutze Python 3.2.2. Wenn ich ein einfaches Programm schreibe, stoße ich auf das Problem.

>>> reload(recommendations)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    reload(recommendations)
NameError: name 'reload' is not defined

Wie soll ich das machen

MindHacks
quelle
9
Ein "einfaches Programm" braucht es wahrscheinlich nicht reload.
Wooble
Ich möchte "reload (Empfehlungen)", "empfehlungen.abc () "verwenden. Aber es kann keine Empfehlungen finden
MindHacks
1
@MindHacks Wenn Sie keine Empfehlungen importiert haben, laden Sie sie nicht neu, sondern importieren sie. import recommendations. Warum hast du gedacht, dass du verwenden musstest reload()?
Gareth Latty
@geoffspear Die meisten "einfachen Programme", die Dateien mit nicht-lateinischen Zeichen lesen, benötigen reloadleider.
Gented
@GennaroTedesco: Wenn Sie an etwas Schreckliches denken, das Sie lesen und das Nachladen (sys) beinhaltet, tun Sie das niemals. Tu es einfach with open('file', 'r', encoding='utf-8') as f: do_whatever. Es ist absolut nicht erforderlich, () Module in einfachen Programmen oder wirklich in einem Python-Programm neu zu laden .
Wooble

Antworten:

154

Sie wollten wahrscheinlich importlib.reload().

from importlib import reload

In Python 2.x war dies eine integrierte Funktion , in 3.x jedoch im importlibModul.

Beachten Sie, dass die Verwendung reload()außerhalb des Dolmetschers im Allgemeinen nicht erforderlich ist. Was haben Sie hier versucht?

Gareth Latty
quelle
Danke, es funktioniert. Aber wenn ich das Neuladen verwenden möchte, muss ich die Datei jedes Mal importieren?
MindHacks
@ MindHacks: Von welcher "Datei" sprichst du?
Sven Marnach
@ MindHacks: impist ein Modul, keine Datei. (Es ist in den Interpreter-Kern integriert und entspricht keiner Datei.) Und ja, um es zu verwenden imp.reload, müssen Sie es importieren imp, aber das ist keine große Sache.
Sven Marnach
@MindHacks Sie müssen importieren, impwo Sie verwenden reload(), ja. So funktioniert der Namespace. Warum sollten Sie ein Modul außerhalb der interaktiven Eingabeaufforderung überhaupt neu laden?
Gareth Latty
3
Danke, aber seufz. Warum versuchen sie nicht, die Shell nützlicher zu machen?
Thomas Ahle
12

Ein Update zu @Gareth Pattys Antwort. impwurde in Python 3.4 abgeschrieben. Jetzt willst du importlib.reload().

from importlib import reload
James Hirschorn
quelle
11

Versuchen Sie es importlib.reload.

Laden Sie ein zuvor importiertes Modul neu. Das Argument muss ein Modulobjekt sein, daher muss es zuvor erfolgreich importiert worden sein. Dies ist nützlich, wenn Sie die Modulquelldatei mit einem externen Editor bearbeitet haben und die neue Version ausprobieren möchten, ohne den Python-Interpreter zu verlassen.

from importlib import reload

reload(module_name)
Biplab Malakar
quelle
0

Wie andere gesagt haben, brauchen Sie entweder importlib.reload(module)oder zu einem früheren Zeitpunkt, den Sie brauchen from importlib import reload. Sie können das aber from importlib import reloadin einer Initialisierungsdatei ausblenden . Stellen Sie sicher, dass dies PYTHONSTARTUPin Ihrer Shell definiert ist. Zum Beispiel,

export PYTHONSTARTUP=$HOME/python/startup.py

Möglicherweise ist dies eine sinnvolle Zeile, die Sie hinzufügen können ~/.bash_profile, wenn Ihre Shell bash ist und je nachdem, wo Sie Ihre Python-Dateien speichern. (Wenn Sie diese Anweisungen befolgen, starten Sie an dieser Stelle ein neues Terminalfenster, damit die Zeile ausgeführt wird.) Anschließend können Sie die Zeile einfügen

from importlib import reload

in ~/python/startup.pyund es wird automatisch passieren. (Wenn Sie mitmachen, starten Sie an dieser Stelle eine neue Python-Sitzung.) Dies mag etwas komplex aussehen, nur um dieses eine Problem zu lösen, aber es ist eine Sache, die Sie nur einmal und dann für jedes ähnliche Problem tun müssen Nach dem Motto „Ich wünschte, Python würde dies immer tun“ können Sie die Lösung finden ~/python/startup.pyund vergessen , sobald Sie sie gefunden haben.

Adam Chalcraft
quelle