Je sais que cela peut être fait, mais je ne me souviens jamais comment.
Comment réimporter un module en python? Le scénario est le suivant: j'importe un module de manière interactive et je le bricole, mais je fais face à une erreur. Je corrige l'erreur dans le fichier .py puis je souhaite réimporter le module fixe sans quitter python. Comment puis-je le faire ?
Réponses:
Cela devrait fonctionner:
Depuis les documents Python
Si vous utilisez Python 3.4 et plus, faites-le
import importlib
, puis faites-leimportlib.reload(nameOfModule)
.N'oubliez pas les mises en garde d'utiliser cette méthode:
Lorsqu'un module est rechargé, son dictionnaire (contenant les variables globales du module) est conservé. Les redéfinitions de noms remplaceront les anciennes définitions, donc ce n'est généralement pas un problème, mais si la nouvelle version d'un module ne définit pas un nom qui était défini par l'ancienne version, l'ancienne définition n'est pas supprimée.
Si un module importe des objets d'un autre module à l'aide
from ... import ...
, l'appelreload()
à l'autre module ne redéfinit pas les objets importés à partir de celui-ci - une façon de contourner cela consiste à réexécuter l'from
instruction, une autre consiste à utiliserimport
et des noms qualifiés (module.*name*
) à la place.Si un module instancie des instances d'une classe, le rechargement du module qui définit la classe n'affecte pas les définitions de méthode des instances - il continue d'utiliser l'ancienne définition de classe. Il en va de même pour les classes dérivées.
la source
from filename import *
. Comment recharger?import foo; from foo import bar; reload(foo)
En python 3,
reload
n'est plus une fonction intégrée.Si vous utilisez python 3.4+, vous devez utiliser
reload
à laimportlib
place à partir de la bibliothèque:Si vous utilisez python 3.2 ou 3.3, vous devez:
au lieu. Voir http://docs.python.org/3.0/library/imp.html#imp.reload
Si vous utilisez
ipython
, envisagez certainement d'utiliser l'autoreload
extension:la source
imp.reload
est obsolète depuis Python 3.4, utilisez plutôt laimportlib.reload
fonction .from mymodule import myfunc
, alorsimportlib.reload(myfunc)
,importlib.reload(mymodule.myfunc)
,importlib.reload(mymodule)
tous donnent une NameError.En fait, dans Python 3, le module
imp
est marqué comme DÉCONSEILLÉ. Eh bien, au moins, c'est vrai pour la 3.4.Au lieu de cela, la
reload
fonction duimportlib
module doit être utilisée:https://docs.python.org/3/library/importlib.html#importlib.reload
Mais sachez que cette bibliothèque a subi quelques modifications API avec les deux dernières versions mineures.
la source
Si vous souhaitez importer une fonction ou une classe spécifique à partir d'un module, vous pouvez le faire:
la source
Bien que les réponses fournies fonctionnent pour un module spécifique, elles ne rechargeront pas les sous-modules, comme indiqué dans Cette réponse :
Cependant, si vous utilisez la
__all__
variable pour définir l'API publique, il est possible de recharger automatiquement tous les modules accessibles au public:Les mises en garde notées dans la réponse précédente sont cependant toujours valables. Notamment, la modification d'un sous-module qui ne fait pas partie de l'API publique comme décrit par la
__all__
variable ne sera pas affectée par un rechargement à l'aide de cette fonction. De même, la suppression d'un élément d'un sous-module ne sera pas reflétée par un rechargement.la source