2009-08-10 13 views
205

So che si può fare, ma non ricordo mai come.Reimportare un modulo in python mentre interattivo

Come si può reimportare un modulo in python? Lo scenario è il seguente: imposto un modulo in modo interattivo e lo modifico, ma poi affronterò un errore. Correggo l'errore nel file .py e poi voglio reimportare il modulo fisso senza uscire da python. Come posso farlo ?

+1

Possibile duplicato di [Come scaricare (ricaricare) un modulo Python?] (Http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module) – Walter

+0

[ reimport python module] (https://stackoverflow.com/a/437591/6521116) –

risposta

204

Questo dovrebbe funzionare:

reload(my.module) 

Dal Python docs

Ricarica un modulo precedentemente importato. L'argomento deve essere un oggetto modulo, quindi deve essere stato importato correttamente prima. Questo è utile se hai modificato il file sorgente del modulo usando un editor esterno e vuoi provare la nuova versione senza lasciare l'interprete Python.

+48

** Non dimenticare le avvertenze sull'uso di questo metodo **: quando un modulo viene ricaricato, il suo dizionario (contenente le variabili globali del modulo) ** viene mantenuto **. Le ridefinizioni dei nomi sostituiranno le vecchie definizioni, quindi questo non è generalmente un problema. Se la nuova versione di un modulo non definisce un nome definito dalla vecchia versione, la vecchia definizione rimane. – nosklo

+46

** Non dimenticare le avvertenze sull'uso di questo metodo **: se un modulo importa oggetti da un altro modulo usando 'da ... import ...', chiamando 'reload()' per l'altro modulo ** non ridefinire gli oggetti importati da esso ** - un modo per ovviare a questo è eseguire di nuovo l'istruzione 'from', un'altra è usare 'import' e nomi qualificati (' modulo. * nome * '). – nosklo

+41

** Non dimenticare le avvertenze sull'uso di questo metodo **: se un modulo crea istanze di una classe, ricaricare il modulo che definisce la classe ** non influenza le definizioni dei metodi delle istanze ** - esse ** continua usare la * vecchia * definizione della classe **. Lo stesso vale per le classi derivate. – nosklo

138

In python 3, reload non è più una funzione incorporata.

Se si sta utilizzando Python 3.4+ si dovrebbe usare reload dalla libreria importlib invece:

import importlib 
importlib.reload(some_module) 

Se si sta utilizzando Python 3.2 o 3.3 è necessario:

import imp 
imp.reload(module) 

invece. Vedere http://docs.python.org/3.0/library/imp.html#imp.reload

Se si utilizza ipython, sicuramente considerare utilizzando l'estensione autoreload:

%load_ext autoreload 
%autoreload 2 
+0

Sebbene molto codice Python sia scritto in Python 2, Python 3 sta diventando un'opzione valida ogni giorno. Grazie per il consiglio! –

+32

'imp.reload' è deprecato da Python 3.4, usa invece la funzione [' importlib.reload'] (http://docs.python.org/3.4/library/importlib.html#importlib.reload). – jfs

41

In effetti, in Python 3 modulo imp è contrassegnato come deprecato. Bene, almeno questo è vero per 3.4.

Invece la funzione reload dal modulo importlib deve essere utilizzato:

https://docs.python.org/3/library/importlib.html#importlib.reload

ma essere consapevoli che questa biblioteca ha avuto alcune API-modifiche con le ultime due versioni minori.

Problemi correlati