Vraag hoe de module "opnieuw te importeren" naar python en de code na het importeren te veranderen


ik heb een foo.py

def foo():
    print "test"

In IPython gebruik ik:

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

Toen heb ik de foo() naar:

def foo():
    print "test changed"

In IPython is het resultaat voor het aanroepen nog steeds test:

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

Dan gebruik ik:

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

Ik verwijder de foo.pyc in dezelfde map foo.py bestaat, maar nog steeds geen geluk.

Kan ik weten hoe ik de bijgewerkte code tijdens runtime opnieuw importeer?


51
2017-11-06 02:49


oorsprong


antwoorden:


Voor Python 2.x

reload(foo)

Voor Python 3.x

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

67
2017-11-06 02:58



Naast het antwoord van gnibbler:

Dit veranderde in Python 3 naar:

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

Zoals @onnodb opmerkt, imp is verouderd ten gunste van importlib sinds Python 3.4:

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

59
2017-11-06 13:01



IPython3's autoreload functie werkt precies goed.

Ik gebruik het eigenlijke voorbeeld van de webpagina. Laad eerst de 'autoreload'-functie.

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

Importeer vervolgens de module die u wilt testen:

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

Open foo.py in een editor en wijzig some_function om 43 terug te keren

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

Het werkt ook als u de functie rechtstreeks importeert.

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

Wijzig in some_function om 43 terug te keren.

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

24
2017-07-07 18:18



Als u wilt dat dit automatisch gebeurt, is er de autoreload module die bij iPython wordt geleverd.


4
2017-10-23 15:41