come "reimportare" il modulo in Python, quindi modificare il codice dopo l'importazione


92

Ho un foo.py

def foo():
    print "test"

In IPython utilizzo:

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

Quindi ho cambiato foo()in:

def foo():
    print "test changed"

In IPython, il risultato per invocare è ancora test:

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

Quindi uso:

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

Elimino la foo.pycstessa cartella foo.pyesistente, ma ancora senza fortuna.

Posso sapere come reimportare il codice aggiornato in runtime?


Risposte:


121

Per Python 2.x

reload(foo)

Per Python 3.x

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

23
In realtà, basta "ricaricare (pippo)" - non è necessario riattribuirlo
— jsbueno

2
Non sono riuscito a farlo funzionare. Ricevo TypeError: l'argomento reload () deve essere module
— Burak

2
@Burak, è l'argomento che stai passando a reloadun modulo ?. per esempio. Dovresti farlo in import fooanticipo
— John La Rooy

27
Nota che se hai fatto from foo import *o from foo import bar, il simbolo foonon viene definito. Devi import sysallora reload(sys.modules['foo'])o forsereload(sys.modules[bar.__module__])
— drevicko

3
Per favore, lascia che Python 2.x muoia asp e smetti di supportare Python 2.x! Un conto alla rovescia per il ritiro di python 2.x pythonclock.org .
— Martijn van Wezel

66

Oltre alla risposta di gnibbler:

Questo è cambiato in Python 3 in:

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

Come sottolinea @onnodb, impè deprecato a favore di importlibda Python 3.4:

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

5
Solo una piccola nota a margine: nelle versioni successive di Python 3.x, "imp" è deprecato a favore di "importlib". Funziona allo stesso modo, però.
— onnodb

56

La funzione di caricamento automatico di IPython3 funziona perfettamente.

Sto usando l'esempio reale dalla pagina web. Innanzitutto carica la funzione di "caricamento automatico".

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

Quindi importa il modulo che vuoi testare:

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

Apri foo.py in un editor e cambia some_function per restituire 43

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

Funziona anche se importi direttamente la funzione.

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

Apporta modifiche in qualche_funzione per restituire 43.

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

1
da foo importa some_function, non funziona con Jupyterlab Python 3.7.3
— Robert Nowak

7

Se vuoi che ciò avvenga automaticamente, c'è il modulo di caricamento automatico fornito con iPython.


da foo importa some_function, non funziona con Jupyterlab Python 3.7.3
— Robert Nowak

@Robert Nowak Mi sono imbattuto in questo, ma ha funzionato quando ho provato solo "import some_function" senza "from foo" più avanti nel mio codice dopo l'originale from foo import some_function.
— Michael Szczepaniak
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.