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.