web-dev-qa-db-fra.com

comment "réimporter" le module vers python puis modifier le code après l'importation

J'ai un foo.py

def foo():
    print "test"

Dans IPython, j'utilise:

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

J'ai ensuite changé la 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.pyc Dans le même dossier foo.py Existe, mais toujours pas de chance.

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

70
user478514

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)
93
John La Rooy

En plus de la réponse de gnibbler:

Cela a changé en Python 3 en:

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

Comme le souligne @onnodb, imp est déconseillé au profit de importlib depuis Python 3.4:

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

La fonction autoreload d'IPython3 fonctionne parfaitement.

J'utilise l'exemple réel de la page Web. Chargez d'abord la fonction de "rechargement automatique".

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 changez some_function pour retourner 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

Apportez des modifications dans some_function pour retourner 43.

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

Si vous souhaitez que cela se produise automatiquement, il existe le module autoreload fourni avec iPython.

4
CpILL