mam foo.py
def foo():
print "test"
W IPythonie używam:
In [6]: import foo
In [7]: foo.foo()
test
Następnie zmieniłem na foo()
:
def foo():
print "test changed"
W IPythonie wynikiem wywołania jest nadal test
:
In [10]: import foo
In [11]: foo.foo()
test
Następnie używam:
In [15]: del foo
In [16]: import foo
In [17]: foo.foo()
test
Usuwam ten foo.pyc
sam folder foo.py
, ale nadal nie mam szczęścia.
Czy mogę wiedzieć, jak ponownie zaimportować zaktualizowany kod w czasie wykonywania?
python
runtime
ipython
overloading
python-import
user478514
źródło
źródło
Odpowiedzi:
W przypadku Pythona 2.x
W przypadku Pythona 3.x
import importlib import foo #import the module here, so that it can be reloaded. importlib.reload(foo)
źródło
reload
modułu ?. na przykład. Powinieneś to zrobićimport foo
wcześniejfrom foo import *
lubfrom foo import bar
, symbolfoo
nie zostanie zdefiniowany. Musiszimport sys
wtedy,reload(sys.modules['foo'])
a możereload(sys.modules[bar.__module__])
Oprócz odpowiedzi Gnibblera:
Zmieniło się to w Pythonie 3 na:
>>> import imp >>> imp.reload(foo)
Jak wskazuje @onnodb,
imp
jest przestarzały na korzyśćimportlib
od wersji 3.4:>>> import importlib >>> importlib.reload(foo)
źródło
Funkcja automatycznego ładowania IPython3 działa poprawnie.
Używam rzeczywistego przykładu ze strony internetowej. Najpierw załaduj funkcję „autoreload”.
In []: %load_ext autoreload In []: %autoreload 2
Następnie zaimportuj moduł, który chcesz przetestować:
In []: import foo In []: foo.some_function() Out[]: 42
Otwórz foo.py w edytorze i zmień some_function na powrót 43
In []: foo.some_function() Out[]: 43
Działa również, jeśli importujesz funkcję bezpośrednio.
In []: from foo import some_function In []: some_function() Out[]: 42
Wprowadź zmianę w jakiejś_funkcji, aby zwrócić 43.
In []: some_function() Out[]: 43
źródło
Jeśli chcesz, aby działo się to automatycznie, dostępny jest moduł automatycznego ładowania , który jest dostarczany z iPythonem.
źródło