comment «réimporter» le module en python puis le code être modifié après l'importation

88

j'ai un foo.py

def foo():
    print "test"

Dans IPython, j'utilise:

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

Ensuite, j'ai changé le foo()en:

def foo():
    print "test changed"

Dans IPython, le résultat de l'appel 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.pycdans le même dossier foo.pyexiste, mais toujours pas de chance.

Puis-je savoir comment réimporter le code mis à jour au moment de l'exécution?

user478514
la source
2
Possible duplication de Réimporter un module en python en mode interactif
Praveen

Réponses:

117

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)
John La Rooy
la source
23
En fait, il suffit de "recharger (toto)" - pas besoin de le réattribuer
jsbueno
2
Je n'ai pas pu le faire fonctionner. J'obtiens TypeError: l'argument reload () doit être module
Burak
2
@Burak, l'argument que vous passez à reloadun module?. par exemple. Vous devriez le faire à l' import fooavance
John La Rooy
27
Notez que si vous avez fait from foo import *ou from foo import bar, le symbole foon'est pas défini. Vous devez import sysalors reload(sys.modules['foo'])ou peutreload(sys.modules[bar.__module__])
drevicko
3
S'il vous plaît, laissez Python 2.x mourir asp et arrêtez de supporter Python 2.x! Un compte à rebours pour le retrait de python 2.x pythonclock.org .
Martijn van Wezel
65

En plus de la réponse de gnibbler:

Cela a changé dans Python 3 en:

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

Comme le souligne @onnodb, impest obsolète au profit de importlibdepuis Python 3.4:

>>> import importlib
>>> importlib.reload(foo)
Danlei
la source
5
Juste une petite remarque: dans les versions ultérieures de Python 3.x, "imp" est obsolète au profit de "importlib". Fonctionne de la même manière, cependant.
onnodb
54

La fonction de chargement automatique d' IPython3 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 renvoyer 43

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

Cela fonctionne également si vous importez directement la fonction.

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

Modifiez une fonction pour renvoyer 43.

In []: some_function()
Out[]: 43
Ashfaq
la source
1
de foo import some_function, ne fonctionne pas sous Jupyterlab Python 3.7.3
Robert Nowak
7

Si vous voulez que cela se produise automatiquement, il existe le module de chargement automatique fourni avec iPython.

CpILL
la source
de foo import some_function, ne fonctionne pas sous Jupyterlab Python 3.7.3
Robert Nowak