In Python è possibile ricaricare un modulo come segue ...pacchetti di ricarica (e le loro sottomoduli) ricorsivamente in Python
import foobar
import importlib
importlib.reload(foobar)
Questo funziona per .py
file, ma per pacchetti di Python si ricaricherà solo il pacchetto e non uno qualsiasi dei sottomoduli nidificati.
Con un pacchetto:
foobar/__init__.py
foobar/spam.py
foobar/eggs.py
Script Python:
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.
Non suggerire ° è un bug, ma a volte è utile ricaricare un pacchetto e tutti i suoi sottomoduli. (Se si desidera modificare un modulo mentre uno script viene eseguito ad esempio).
Quali sono alcuni buoni modi per ricaricare ricorsivamente un pacchetto in Python?
Note:
Ai fini di questa domanda assumono l'ultima Python3.x
(attualmente in uso
importlib
)- Permettere che questo può requre alcune modifiche ai moduli stessi.
- Supporre che le importazioni con caratteri jolly non vengano utilizzate (
from foobar import *
), poiché potrebbero complicare la logica di ricarica.
IPython fornisce il modulo 'IPython.lib.deepreload' di ricarica ricorsivo. Il [codice può essere trovato qui] (https://github.com/ipython/ipython/blob/master/IPython/lib/deepreload.py). È interessante notare che il modulo è 285 sloc. – jme
Un grande suggerimento, ma la sostituzione dei ganci di importazione è una sorta di soluzione pesante (che ha senso per IPython) ma non alcuni frammenti che vorrei nel mio progetto solo per ricaricarmi lavorando un po 'più utilmente. – ideasman42