2009-06-07 6 views
109

J'essaye de recharger un module que j'ai déjà importé en Python 3. Je sais que vous avez seulement besoin d'importer une fois et l'exécution de la commande import ne fera pas l'affaire n'importe quoi.Rechargement du module donnant NameError: le nom 'reload' n'est pas défini

exécution reload(foo) est de donner cette erreur:

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

Qu'est-ce que l'erreur?

Répondre

-10

Vous avez supprimé votre variable __builtins__.

Comment résoudre ce problème? Ne supprimez pas __builtins__.

Also can someone explain step by step what that error message means?

Cela signifie que python ne trouve pas la fonction "reload".

reload (script4.py)

Ceci est incorrect. si vous avez "import script4", alors vous devez faire "reload (script4)"

+0

Je reçois la même erreur mais mon __builtins__ existe – Billybonks

+0

Où est la partie où il supprime '__builtins__' – OverCoder

160

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

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

+16

Cette réponse donne l'impression qu'il est mauvais de recharger un module en Python 3. Quelle est la raison derrière tout cela? – ABM

+5

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 être exécuté deux fois. Il est donc préférable d'éviter de recharger, mais souvent très pratique. – Evan

+2

Je dirais que c'est souvent problématique, mais pas toujours. Pour être sûr, je pense que les cas d'utilisation valables pour écrire 'reload' dans un script sont vraiment rares, et ceux qui utilisent ce genre d'art sombre ont peu de chance de lire ce commentaire. Cependant, si vous développez un module et utilisez une console IPython pour le tester de manière interactive, alors reload peut être utile dans ce flux de travail. Comme l'a dit @Evan, cependant, attention aux effets secondaires à l'importation. En général, je dirais d'éviter de recharger les modules de quelqu'un d'autre. «recharger» le vôtre prend tout son sens au moment du design. –

50
import imp 
imp.reload(script4) 
+3

Déconseillé depuis Python 3.4 - utilisez 'importlib' à la place. –

46

Pour> = Python3.4:

import importlib 
importlib.reload(module) 

Pour < = Python3.3:

import imp 
imp.reload(module) 

Pour python2.X:

Utilisez la fonction reload() intégré.

reload(module) 
15

Pour développer les réponses, si vous voulez écrire au préalable une solution unique fonctionnant à travers les versions de Python 2 et 3, vous pouvez utiliser les éléments suivants:

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 
+11

Est-ce que passer de Python 2 à 3 n'est pas si amusant? – speedplane

+0

très utile! Merci. –

8

Je recommande d'utiliser les éléments suivants extrait de code comme cela fonctionne dans toutes les versions de python (nécessite six):

from six.moves import reload_module 
reload_module(module) 
Questions connexes