Jusqu'à présent, j'ai quitté et réintroduit l'interpréteur parce que la réimportation du fichier ne fonctionne pas pour moi.
Oui, je dis ça comme ça. import
vous donne à nouveau la copie existante du module de sys.modules
.
Vous pouvez dire reload(module)
de mettre à jour sys.modules
et obtenir une nouvelle copie de ce module unique, mais si d'autres modules ont une référence au module original ou tout objet du module d'origine ils garderont leurs anciennes références et des choses très confuses se produiront.
Donc si vous avez un module a
qui dépend du module b
et b
vous devez "recharger b" puis "recharger a". Si vous avez deux modules qui dépendent l'un de l'autre, ce qui est extrêmement fréquent lorsque ces modules font partie du même paquet, vous ne pouvez pas les recharger tous les deux : si vous rechargez p.a
il obtiendra une référence à l'ancien p.b
et vice versa. La seule façon de le faire est de les décharger tous les deux en une seule fois en supprimant leurs éléments de sys.modules
avant de les importer à nouveau. C'est dégoûtant et il y a quelques pièges pratiques liés au fait que les entrées de modules ne sont pas considérées comme un marqueur d'échec d'importation relative.
Et si vous avez un module qui passe des références à ses objets aux modules système - par exemple, il enregistre un codec ou ajoute un gestionnaire d'avertissements - vous êtes coincé ; vous ne pouvez pas recharger le module système sans perturber le reste de l'environnement Python.
En résumé : pour tout sauf le cas le plus simple d'un module autonome chargé par un script autonome, reload()
est très difficile à mettre en œuvre ; si, comme vous le laissez entendre, vous utilisez un "paquet", il est probablement préférable de continuer à faire tourner l'interpréteur.
2 votes
Il semble que cette question ait été posée/répondue avant la sortie de reimport. Voir ma réponse ci-dessous pour de nouvelles informations.
3 votes
Les importations en Python sont mises en cache, donc normalement la deuxième importation et les suivantes obtiennent le même code même si le fichier a changé.