2015-10-24 6 views
5

Python Console con Python 3.4.2Come ricaricare un modulo dopo averlo sostituito?

ho definito una funzione in un modulo che viene eseguito correttamente in Python Console in PyCharm Community Edition 4.5.4:
ReloadTest.py:

def reloadtest(x): 
    print("Version A: {}".format(x)) 

Python Console:

Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32 
>>> from ReloadTest import reloadtest 
>>> reloadtest(1) 
Version A: 1 

Dopo ho modificato la funzione di "versione B", PyCharm non riesce a trovare la modifica e importlib.reload(ReloadTest) mi dà errore.
Devo ricaricare la console Python o riavviare PyCharm ogni volta che modifico un modulo. Che cosa ho fatto di sbagliato? Qual è il modo migliore per gestire questo?

ReloadTest.py:

def reloadtest(x): 
    print("Version B: {}".format(x)) 

Python Console:

>>> reloadtest(1) 
Version A: 1 
>>> from ReloadTest import reloadtest 
>>> reloadtest(1) 
Version A: 1 
>>> import importlib 
>>> importlib.reload(ReloadTest) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
NameError: name 'ReloadTest' is not defined 
>>> from ReloadTest import reloadtest 
>>> reloadtest(1) 
Version A: 1 
>>> import ReloadTest 
>>> reloadtest(1) 
Version A: 1 
+0

Utilizzare la funzione [autoreload] (https://ipython.org/ipython-doc/3/config/extensions/autoreload.html) IPython e. :) –

risposta

2

farlo funzionare!
Invece di from Module import function, devo importare l'intero modulo import Module, quindi chiamare la funzione Module.function(). Questo perché

from ReloadTest import reloadtest 

e

importlib.reload(ReloadTest) 

non possono andare insieme.

>>> import ReloadTest 
>>> ReloadTest.reloadtest(1) 
Version A: 1 

dopo aver apportato modifiche:

>>> importlib.reload(ReloadTest) 
<module 'ReloadTest' from 'C:\\...\\ReloadTest.py'> 
>>> ReloadTest.reloadtest(2) 
Version B: 2 
2

me ho preso un po 'di tempo per capire la risposta precedente ... E inoltre, che la risposta non è molto pratico se il mandrino di codice necessario per l'esecuzione è nel mezzo di una sceneggiatura che non hai voglia di modificare per eseguirla una volta.

si può semplicemente fare:

import importlib 
importlib.reload(my_module) 
from my_module import my_function 

Quindi, è possibile eseguire il codice con la versione aggiornata della funzione.

Funziona con PyCharm Community Edition 2016.3.2

Modifica w.r.t. primo commento: Funziona solo se prima hai importato il modulo stesso (altrimenti ottieni un errore come detto nel primo commento).

import my_module 
from my_module import my_function 
# Now calls a first version of the function 
# Then you change the function 
import importlib 
importlib.reload(my_module) 
from my_module import my_function 
# Now calls the new version of the function 
+1

La tua risposta è esattamente la stessa di quella che dice la mia domanda originale, che causa un errore NameError e non funziona. Ora ho provato di nuovo con PyCharm Community Edition 2016.3.3, è ancora esattamente come prima. Mi chiedo cosa rende il mio diverso dal tuo. – wokbot

+0

@armlet In effetti, ho dimenticato di dire che funziona solo se prima si importa il modulo in modo che il suo nome sia definito. Ho modificato la mia risposta :) – Eskapp

+1

Alla luce della mia migliore conoscenza di Python ora, la tua prima risposta è simile alla mia, tuttavia in quel momento mi ci è voluto del tempo per farlo funzionare. Quindi, lascio questa risposta qui per i nuovi utenti come me che potrebbero essere confusi su come fare se la loro funzione modificata viene chiamata in molti punti del loro codice e se hanno fatto direttamente la loro chiamata con i nomi delle funzioni. – Eskapp

0

Dal momento che questa domanda ha chiesto specificamente circa PyCharm, si prega di verificare la risposta sul PyCharm Support site. Questa risposta è quasi identica a @ wokbot, la distinzione è che PyCharm rimuove la necessità di import importlib. Utilizza anche il trucco from ... import ... dopo import ... per semplificare la digitazione se si prevede di utilizzare frequentemente reloadtest.

In[2]: import ReloadTest 
In[3]: from ReloadTest import reloadtest 
In[4]: reloadtest(1) 
Out[4]: Version A: 1 

...apportare modifiche

In[5]: reload(ReloadTest) 
Out[5]: <module 'ReloadTest' from 'C:\\...\\ReloadTest.py'> 
In[6]: from ReloadTest import reloadtest 
In[7] reloadtest(2) 
Out[7]Version B: 2