W Pythonie można przeładować moduł następująco ...pakiety przeładunkowych (i ich Submoduły) rekursywnie w Pythonie
import foobar
import importlib
importlib.reload(foobar)
Działa to dla .py
plików, ale dla pakietów Python będzie przeładować tylko pakiet i a nie żadnego z zagnieżdżonych pod-modułów.
Z pakietu:
foobar/__init__.py
foobar/spam.py
foobar/eggs.py
Python Script:
import foobar
# assume `spam/__init__.py` is importing `.spam`
# so we dont need an explicit import.
print(foobar.spam) # ok
import importlib
importlib.reload(foobar)
# foobar.spam WONT be reloaded.
Nie sugeruje th jest błędem, ale czasami warto ponownie załadować pakiet i wszystkie jego podmoduły. (Jeśli chcesz edytować moduł, gdy skrypt działa na przykład).
Jakie są dobre sposoby rekurencyjnego ponownego załadowania pakietu w Pythonie?
Uwagi:
Dla celów tej kwestii przyjąć ostatnią Python3.x
(obecnie za pomocą
importlib
)- Pozwalając, że może to requre pewne zmiany do samych modułów.
- Załóżmy, że import symboli wieloznacznych nie jest używany (
from foobar import *
), ponieważ mogą one komplikować logikę przeładowania.
ipython zapewnia moduł 'IPython.lib.deepreload' dla rekurencyjnego przeładunku. [Kod można znaleźć tutaj] (https://github.com/ipython/ipython/blob/master/IPython/lib/deepreload.py). Co ciekawe, moduł ma 285 sloc. – jme
Świetna wskazówka, ale zastąpienie haków importowych jest rodzajem ciężkiego rozwiązania (które ma sens w przypadku IPython), ale nie fragmentem, którego chciałbym w moim projekcie, aby nieco bardziej użyteczne było ponowne ładowanie. – ideasman42