130 votes

Comment réimporter un module en python et modifier le code après l'importation ?

J'ai un foo.py

def foo():
    print "test"

En IPython, j'utilise :

In [6]:  import foo
In [7]:  foo.foo()
test

J'ai ensuite modifié le foo() à :

def foo():
    print "test changed"

En IPython, le résultat de l'invocation est toujours test :

In [10]:  import foo
In [11]:  foo.foo()
test

Ensuite, j'utilise :

In [15]: del foo
In [16]:  import foo
In [17]:  foo.foo()
test

Je supprime le foo.pyc dans le même dossier foo.py existe, mais toujours pas de chance.

Puis-je savoir comment réimporter le code mis à jour en cours d'exécution ?

164voto

gnibbler Points 103484

Pour Python 2.x

reload(foo)

Pour Python 3.x

import importlib
import foo #import the module here, so that it can be reloaded.
importlib.reload(foo)

83voto

Ashfaq Points 697

Les fonctions de IPython3 autoreload fonctionne parfaitement.

J'utilise l'exemple réel de la page web. Commencez par charger la fonction "autoreload".

In []: %load_ext autoreload
In []: %autoreload 2

Importez ensuite le module que vous souhaitez tester :

In []: import foo
In []: foo.some_function()
Out[]: 42

Ouvrez foo.py dans un éditeur et modifiez some_function pour qu'elle renvoie 43

In []: foo.some_function()
Out[]: 43

Cela fonctionne également si vous importez la fonction directement.

In []: from foo import some_function
In []: some_function()
Out[]: 42

Modifier la fonction "some_function" pour qu'elle renvoie 43.

In []: some_function()
Out[]: 43

72voto

danlei Points 8602

En complément de la réponse de gnibbler :

Cela a changé dans Python 3 en :

>>> import imp
>>> imp.reload(foo)

Comme le souligne @onnodb, imp est obsolète en faveur de importlib depuis Python 3.4 :

>>> import importlib
>>> importlib.reload(foo)

7voto

CpILL Points 167

Si vous souhaitez que cela se fasse automatiquement, vous pouvez utiliser la fonction autoreload fourni avec iPython.

2voto

Dániel Bara Points 11

Dans [15], au lieu de del foo , utiliser

import sys
del sys.modules["foo"]

pour supprimer foo du cache du module

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X