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?


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)

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)

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

1
de foo import some_function, ne fonctionne pas sous Jupyterlab Python 3.7.3
Robert Nowak

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.