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.