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?

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:


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)

48
import imp
imp.reload(script4)

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

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)

2

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

# Python 2 and 3
from imp import reload
reload(mymodule)

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.