Module de rechargement donnant NameError: le nom 'reload' n'est pas défini

162

J'essaie de recharger un module que j'ai déjà importé en Python 3. Je sais que vous n'avez besoin d'importer qu'une seule fois et que l'exécution de la importcommande à nouveau ne fera rien.

L'exécution reload(foo)donne cette erreur:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

Que signifie l'erreur?

Prix ​​Lonnie
la source

Réponses:

239

reload est intégré à Python 2, mais pas à Python 3, l'erreur que vous voyez est donc attendue.

Si vous devez vraiment recharger un module dans Python 3, vous devez utiliser soit:

Alex Martelli
la source
37
Cette réponse donne l'impression qu'il est mauvais de recharger un module en Python 3. Quelle est la réflexion derrière cela?
ABM
11
Le rechargement est toujours problématique. Le rechargement met à jour les variables du module, mais ne supprime pas les anciennes, donc si vous renommez quelque chose, l'ancien nom existera toujours. Si vous modifiez les définitions de classe, les objets existants auront toujours l'ancien type. Enfin, certains modules exécutent du code au moment de l'importation qui n'est pas conçu pour s'exécuter deux fois. Il vaut donc mieux éviter le rechargement, mais souvent très pratique.
Evan
13
Je dirais que c'est souvent problématique, mais pas toujours . Pour être sûr, je pense que les cas d'utilisation valides pour écrire reloaddans un script sont très rares, et ceux qui utilisent ce type d'art sombre ne liront probablement pas ce commentaire. Cependant, si vous développez un module et utilisez une console IPython pour le tester de manière interactive, cela reloadpeut être utile dans ce flux de travail. Cependant, comme @Evan l'a dit, faites attention aux effets secondaires au moment de l'importation. En général, je dirais d'éviter reloadles modules de quelqu'un d'autre. reloadle vôtre a du sens au moment de la conception.
Tim D
6
J'utilise le notebook Jupyter pour mon travail, et afin de garder les choses en ordre, je place le travail qui devrait nécessiter des révisions minimales dans des packages importables. Cependant, ces choses nécessitent parfois des révisions, et le rechargement est absolument la bonne chose à faire, car mon noyau de notebook contient en mémoire des calculs qui ont pris, littéralement, toute la journée à calculer.
Scott
Le rechargement est vital pour le développement actif des bibliothèques avec des appels chronophages, par exemple les fonctions de base de données. Cependant, l'un des principaux problèmes que vous pouvez rencontrer lors du rechargement des modules est que les fonctions avec les décorateurs auront tendance à ne pas se recharger correctement voir ici
Alexander McFarlane
82

Pour> = Python3.4:

import importlib
importlib.reload(module)

Pour <= Python3.3:

import imp
imp.reload(module)

Pour Python2.x:

Utilisez la reload()fonction intégrée .

reload(module)
Kevin
la source
48
import imp
imp.reload(script4)

la source
7
Obsolète depuis Python 3.4 - utilisez à la importlibplace.
Mark Amery
39

Pour développer les réponses précédemment écrites, si vous voulez une solution unique qui fonctionnera sur les versions 2 et 3 de Python, vous pouvez utiliser ce qui suit:

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3
Joey Wilhelm
la source
12

Je recommande d'utiliser l'extrait de code suivant car il fonctionne dans toutes les versions de python (nécessite six):

from six.moves import reload_module
reload_module(module)
Alleo
la source
2

Pour la compatibilité python2 et python3, vous pouvez utiliser:

# Python 2 and 3
from imp import reload
reload(mymodule)
Patrick José Pereira
la source
1
Cela fonctionne dans Python 3.7 (et versions antérieures), mais est déprécié comme @Alex Martelli l'a écrit ci-dessous. Utilisez la réponse d'Alleo 'from six.moves import reload_module'
Charles Plager
2

Si vous ne souhaitez pas utiliser de bibliothèques externes, une solution consiste à recréer la méthode de rechargement de python 2 pour python 3 comme ci-dessous. Utilisez ceci en haut du module (suppose python 3.4+).

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

Le rechargement BTW est très nécessaire si vous utilisez des fichiers python comme fichiers de configuration et que vous souhaitez éviter les redémarrages de l'application .....

user6830669
la source